C# 无法复制文件(使用流源)并在操作后可靠地获取其大小
我遇到了一个问题,即我从一个目录读取一个文件到一个ftp服务器,在写入数据之前,复制数据的调用返回,这导致我的调用代码认为文件是空的,而实际上,数据最终是用正确的数据写入的。这很奇怪。这就像复制发生在幕后,但我的代码无法控制状态。我绝对需要在删除源文件之前确保数据已经写入(否则我们可能会丢失重要数据) 这是我的问题代码。注意:我正在使用System.Net.FtpClient连接到ftp服务器。它的OpenWrite方法返回一个流对象。此外,您在该函数中看到的传输参数只是一个带有配置数据的对象(要连接到的源/目标目录/服务器、凭据、要移动的文件类型等)。显示此对象将是多余的。该代码中存在以下问题:C# 无法复制文件(使用流源)并在操作后可靠地获取其大小,c#,file-io,filestream,ftp-client,C#,File Io,Filestream,Ftp Client,我遇到了一个问题,即我从一个目录读取一个文件到一个ftp服务器,在写入数据之前,复制数据的调用返回,这导致我的调用代码认为文件是空的,而实际上,数据最终是用正确的数据写入的。这很奇怪。这就像复制发生在幕后,但我的代码无法控制状态。我绝对需要在删除源文件之前确保数据已经写入(否则我们可能会丢失重要数据) 这是我的问题代码。注意:我正在使用System.Net.FtpClient连接到ftp服务器。它的OpenWrite方法返回一个流对象。此外,您在该函数中看到的传输参数只是一个带有配置数据的对象(
public static void MoveFromDirectoryToFTP(Transport transport)
{
using (FtpClient destinationServer = new FtpClient())
{
destinationServer.Host = transport.Destination.Host;
destinationServer.Credentials = new NetworkCredential(transport.Destination.UserName, transport.Destination.Password);
destinationServer.Connect();
foreach (var file in Directory.EnumerateFiles(transport.Host, transport.FilePattern))
{
try
{
if (!File.Exists(file))
{
continue;
}
using (FileStream sourceStream = File.Open(file, FileMode.Open, FileAccess.ReadWrite, FileShare.None))
{
if (sourceStream.Length == 0) continue;
using (Stream destinationStream = destinationServer.OpenWrite(Path.GetFileName(file), FtpDataType.Binary))
{
sourceStream.CopyTo(destinationStream, (int)sourceStream.Length);
}
}
//this is returning zero, but a minute later i look at the server and the data is there
Debug.WriteLine("size after copy: " + destinationServer.GetFileSize(Path.GetFileName(file)));
if (destinationServer.GetFileSize(Path.GetFileName(file)) > 0)
{
File.Delete(file);
}
}
catch (Exception e)
{
Helper.LogErrorToDisk(e.Message + " when processing file " + file, e.Source, e.StackTrace);
}
}
}
}
我做错了什么,我能做些什么来实现目录和ftp服务器之间的可靠文件拷贝,反之亦然
**编辑:我刚刚意识到这个GetFileSize方法在我的方法中返回了-1。我不知道为什么,除了当ftp服务器试图获取大小(我确信它正在发送“size”命令)时可能会收到一些奇怪的响应之外。我想知道它是否可能是服务器配置?能否将ftp服务器配置为不允许检索文件大小** 检查目标文件大小是否等于源文件大小,然后删除 伪代码
while destination file size not equal to source file size
sleep (1000ms)
end while
delete destination file