Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/313.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 无法复制文件(使用流源)并在操作后可靠地获取其大小_C#_File Io_Filestream_Ftp Client - Fatal编程技术网

C# 无法复制文件(使用流源)并在操作后可靠地获取其大小

C# 无法复制文件(使用流源)并在操作后可靠地获取其大小,c#,file-io,filestream,ftp-client,C#,File Io,Filestream,Ftp Client,我遇到了一个问题,即我从一个目录读取一个文件到一个ftp服务器,在写入数据之前,复制数据的调用返回,这导致我的调用代码认为文件是空的,而实际上,数据最终是用正确的数据写入的。这很奇怪。这就像复制发生在幕后,但我的代码无法控制状态。我绝对需要在删除源文件之前确保数据已经写入(否则我们可能会丢失重要数据) 这是我的问题代码。注意:我正在使用System.Net.FtpClient连接到ftp服务器。它的OpenWrite方法返回一个流对象。此外,您在该函数中看到的传输参数只是一个带有配置数据的对象(

我遇到了一个问题,即我从一个目录读取一个文件到一个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