等待檔案完全寫入
在某些場景下,確保僅在來源檔案開始時才開始檔案複製操作至關重要完全寫好了。不幸的是,在處理大文件時,這可能具有挑戰性,因為過早的複製嘗試可能會導致可怕的「無法複製文件,因為它已被另一個進程使用」錯誤。
問題的解決方案
雖然此問題沒有完整的解決方案,但存在一種解決方法,其中包括在啟動複製之前定期檢查文件是否仍在修改過程。以下是完成此任務的兩種方法:
方法1
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; }
此方法嘗試打開文件以進行獨佔訪問,如果文件被鎖定,則返回true (即仍在由另一個執行緒寫入或處理)。
方法2
const int ERROR_SHARING_VIOLATION = 32; const int ERROR_LOCK_VIOLATION = 33; private bool IsFileLocked(string file) { if (File.Exists(file)) { 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; }
此方法檢查檔案是否存在及其獨佔存取的可用性,如果檔案被鎖定(即由於共用或鎖定衝突而無法存取),則傳回true。
以上是複製前如何確保文件已完全寫入?的詳細內容。更多資訊請關注PHP中文網其他相關文章!