等待檔案完全寫入
在監視目錄中建立檔案時,常見任務是將其複製到不同的目錄地點。但是,由於在複製過程開始之前文件未完全寫入,因此大檔案傳輸可能會導致失敗。
要解決此問題,解決方法是在複製之前檢查文件的狀態。一種方法是使用 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中文網其他相關文章!