ファイルの書き込みが完了するまで待つ
監視対象のディレクトリにファイルが作成されると、一般的なタスクはそれを別のディレクトリにコピーすることです位置。ただし、大規模なファイル転送では、コピー プロセスが開始される前にファイルが完全に書き込まれていないためにエラーが発生する可能性があります。
この問題に対処するには、コピー前にファイルのステータスを確認する回避策が必要です。 1 つの方法は IsFileLocked 関数を使用することです。この関数は、ファイルがまだ書き込み中または別のスレッドによって処理中の場合に True を返します。以下に例を示します:
private bool IsFileLocked(FileInfo file) { FileStream stream = null; try { stream = file.Open(FileMode.Open, FileAccess.ReadWrite, FileShare.None); } catch (IOException) { return true; } finally { if (stream != null) stream.Close(); } return false; }
このコードは FileSystemWatcher_Created イベント ハンドラーに組み込むことができます:
public static void listener_Created(object sender, FileSystemEventArgs e) { while (IsFileLocked(new FileInfo(e.FullPath))) { // Wait for file to finish writing } File.Copy(e.FullPath, @"D:\levan\FolderListenerTest\CopiedFilesFolder\" + e.Name); }
または、次のメソッドを使用できます:
const int ERROR_SHARING_VIOLATION = 32; const int ERROR_LOCK_VIOLATION = 33; private bool IsFileLocked(string file) { if (File.Exists(file) == true) { FileStream stream = null; try { stream = File.Open(file, FileMode.Open, FileAccess.ReadWrite, FileShare.None); } catch (Exception ex2) { int errorCode = Marshal.GetHRForException(ex2) & ((1 << 16) - 1); if ((ex2 is IOException) && (errorCode == ERROR_SHARING_VIOLATION || errorCode == ERROR_LOCK_VIOLATION)) { return true; } } finally { if (stream != null) stream.Close(); } } return false; }
以上がファイルをコピーする前にファイルが完全に書き込まれたことを確認するにはどうすればよいですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。