上传压缩文件时偶尔出现 ftp 450 错误

Sporadic ftp 450 errors when uploading compressed file

我有一个 800Mb 的文件正在使用 System.IO.Compression ZipArchive 进行压缩,因此:

using (ZipArchive zip = ZipFile.Open(result, ZipArchiveMode.Create))
{
    zip.CreateEntryFromFile(sourceFile, entryName);
}

文件压缩总是成功的。一旦文件被压缩,它就会被上传到 ftp 服务器,并取得不同的成功。上传失败时,会出现以下错误:

远程服务器返回错误:(450) 文件不可用(例如,文件忙)。

堆栈跟踪: 在 System.Net.FtpWebRequest.SyncRequestCallback(对象对象) 在 System.Net.CommandStream.Dispose(布尔处理) 在 System.IO.Stream.Close() 在 System.Net.ConnectionPool.Destroy(PooledStream pooledStream) 在 System.Net.ConnectionPool.PutConnection(PooledStream pooledStream、Object owningObject、Int32 creationTimeout、Boolean canReuse) 在 System.Net.FtpWebRequest.FinishRequestStage(RequestStage 阶段) 在 System.Net.FtpWebRequest.SyncRequestCallback(对象对象) 在 System.Net.CommandStream.Abort(例外 e) 在 System.Net.CommandStream.CheckContinuePipeline() 在 System.Net.FtpDataStream.System.Net.ICloseEx.CloseEx(CloseExState closeState) 在 System.Net.FtpDataStream.Dispose(布尔处理) 在 System.IO.Stream.Close()

如果我改为上传未压缩的原始文件,上传总是成功的。

我怀疑压缩文件以某种方式被锁定,或者 ZipArchive 实例可能没有被释放。我尝试过具有类似不一致结果的替代压缩库。有什么想法吗?

错误的原因原来与我最初的怀疑无关,而是与ftp上传请求有关。由于 zip 文件是二进制格式,因此有必要将请求设置为使用二进制,并避免使用 StreamReader 从文件中获取字节。我的 ftp 代码最终是这样的:

FtpWebRequest request = (FtpWebRequest)WebRequest.Create(new Uri('ftpurl', filePath)));
request.Timeout = timeoutvalue;
request.Method = WebRequestMethods.Ftp.UploadFile;
request.UseBinary = true;
request.Proxy = new WebProxy();
request.Credentials = new NetworkCredential('x','y');

byte[] encodedFileContents = File.ReadAllBytes(filePath);
request.ContentLength = encodedFileContents.Length;

using (Stream requestStream = request.GetRequestStream())
{
    requestStream.WriteTimeout = timeoutvalue;
    requestStream.Write(encodedFileContents, 0, encodedFileContents.Length);
}

using (FtpWebResponse response = (FtpWebResponse)request.GetResponse())
{
}