2017-02-16 10 views
0

私は、FileSystemWatcherのサービスで監視されているフォルダを持っていて、大きなファイルが書き込まれるのを助けるのにこのAnswerを使用しました。FileSystemWatcherが監視しているフォルダで連続してファイルを迅速に作成するにはどうすればいいですか?

しかし、(100MB以上の)連続したファイルの作成があると問題が発生しました。

Q:どうすればこの問題に対処できますか?私のフォルダに書かれた約10個のファイル(それぞれ100MB)のような例です。

注:このフォルダには、ネットワーク経由でアクセスします。ファイルが作成されている可能性がありますが、実際には完全ではありません。 FileSystemWatcherは完全に書き込まれていなくてもファイルを処理できます。開いたファイルが作成されたファイルがあるかどうかをチェックする例外

private static bool IsFileLocked(FileInfo file) 
    { 
     FileStream stream = null; 
     try 
     { 
      stream = file.Open(FileMode.Open, 
        FileAccess.Read, FileShare.None); 
     } 
     catch (IOException) 
     { 
      //the file is unavailable because it is: 
      //still being written to 
      //or being processed by another thread 
      //or does not exist (has already been processed) 
      return true; 
     } 
     finally 
     { 
      if (stream != null) 
       stream.Close(); 
     } 

     //file is not locked 
     return false; 
    } 

現在のコードをスローするかどうかをチェックするための

現在のコード。

private void FSWatcher_Created(object sender, System.IO.FileSystemEventArgs e) 
    { 
     var files = getFiles(FSWatcher.Path); //stores all filenames in the directory in a list 
     if (files.Count() > 0) 
     { 
      foreach (string file in files) 
      { 
       FileInfo file_info = new FileInfo(file); 
       while (IsFileLocked(file_info)) 
       { 
        Thread.Sleep(5000); //Sleep if file unavailable 
       } 
       //code to process the file 
      } 
      //some code here 
     } 
    } 

答えて

0

私は過去にフォルダを見て取り扱わまし方法は、ポーリングを使用する代わりにFileSystemWatcherits not 100% reliable anyway

私はすべてのファイルを通じてループし、最初の「処理」ディレクトリにそれらを移動しようとした作られたプロセッサ。ファイルの書き込みが完了した場合にのみ(おそらく*)は成功するので、移動が成功すると、それを移動したスレッドはそのファイルの処理を(たとえば新しいスレッドで)安全に開始できます。ファイルは一度しか移動できません。つまり、2つの異なるスレッドが同時にファイルを処理しようとすることはありません。

*:アプリケーションが開いたまま移動できるファイルを作成する可能性があります(ただしまれです)

関連する問題