等待文件完全写入
在监视目录中创建文件时,常见任务是将其复制到不同的目录地点。但是,由于在复制过程开始之前文件未完全写入,大文件传输可能会导致失败。
要解决此问题,解决方法是在复制之前检查文件的状态。一种方法是使用 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中文网其他相关文章!