2016-03-28 9 views
0

ディレクトリからftpサーバーにファイルを読み込み、データをコピーする呼び出しがデータの前に返される問題があります。実際にはデータが正しいデータで書き込まれると、ファイルが空であると私の呼び出しコードに考えることを引き起こしています。それは奇妙です。コピーはシーンの裏で起こっているようですが、私のコードではステータスを制御できません。ソースファイルを削除する前にデータが書き込まれていることを確認する必要があります(そうしなければ、重要なデータが失われる可能性があります)。ファイルを(ストリームソースを使用して)コピーできず、動作後に確実にサイズを取得できません。

ここに私のコードがあります。注:私はSystem.Net.FtpClientを使用してftpサーバーに接続しています。そのOpenWriteメソッドはStreamオブジェクトを返します。また、この関数で見られるTransport引数は、設定データ(接続先のソース/宛先ディレクトリ/サーバー、資格情報、移動するファイルの種類など)を持つオブジェクトに過ぎません。このオブジェクトを表示すると冗長になります。問題は、このコードである:私は間違っ

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サーバーを構成できますか? **

答えて

0

宛先ファイルのサイズがソースファイルのサイズと同じであることを確認してから削除してください。擬似コード

..

while destination file size not equal to source file size 
    sleep (1000ms) 
end while 

delete destination file 
関連する問題