复制前确保文件完成
在使用 FileSystemWatcher 检测目录中文件的创建并随后复制它们的场景中到不同的位置,当涉及大文件(> 10MB)时就会出现问题。由于复制过程在文件创建完成之前开始,可能会遇到“无法复制文件,因为它已被另一个进程使用”的错误。
解决方法:
唯一已知的解决方法是在启动复制操作之前检查文件是否被锁定。这可以通过一个函数来实现,该函数反复检查文件是否正在使用,直到返回 false,表示该文件不再被锁定。
方法 1(直接复制):
private bool IsFileLocked(FileInfo file) { FileStream stream = null; try { stream = file.Open(FileMode.Open, FileAccess.ReadWrite, FileShare.None); } catch (IOException) { // File still being written, processed, or doesn't exist return true; } finally { if (stream != null) stream.Close(); } // File not locked return false; }
方法二:
const int ERROR_SHARING_VIOLATION = 32; const int ERROR_LOCK_VIOLATION = 33; private bool IsFileLocked(string file) { // Check destination file status 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; }
以上是如何在复制前确保文件完成以防止'文件正在使用”错误?的详细内容。更多信息请关注PHP中文网其他相关文章!