文件正在被复制吗?

可能重复:
C# – 不时检查文件是否存在并从中读取

我正在使用文件观察器来检查文件是否在目录中被写入。 如果是,那么我想打开它并删除到另一个目录。

我的方法也是使用FileShare.None来确保独占访问。 我做的是:

 class Program { private static void Main(string[] args) { FileSystemWatcher fileWatcher = new FileSystemWatcher(); fileWatcher.NotifyFilter = NotifyFilters.LastAccess | NotifyFilters.LastWrite | NotifyFilters.FileName | NotifyFilters.DirectoryName; fileWatcher.Created += fileWatcher_Created; fileWatcher.EnableRaisingEvents = true; Console.ReadLine(); } private static void fileWatcher_Created(object sender, FileSystemEventArgs e) { WorkOnFile(e.FullPath); } //must be done completely. How do I ensure it? private static void WorkOnFile(string fileName) { using (FileStream f = File.Open(fileName, FileMode.Open, FileAccess.Read, FileShare.None)) { Thread.Sleep(40000); // some long operations } } } 

最重要的是,必须完全执行WorkOnFile()并且只需一次执行一个文件。 如果正在复制文件,那么我需要再次调用WorkOnFile() ,直到它被完全复制并且没有进程正在使用它。

我怎么到达它?

如果您需要尽可能快地移动该文件,您可以尝试使用FileWatcher监视“LastWrite”,并在一小段时间后尝试移动文件。

我必须做一些非常相似的事情,但并不着急,重要的是文件可靠移动。 所以我改为使用System.Timers.Timer每分钟运行一次:

 var scanDirectoryIn = new DirectoryInfo(folderIn); foreach (var fileInfo in scanDirectoryIn.GetFiles()) { if (fileInfo.Extension != ".csv") continue; if (DateTime.UtcNow.Subtract(fileInfo.LastWriteTimeUtc).TotalMinutes < 5) continue; try { fileInfo.MoveTo(folderOut + "\\" + fileInfo.Name); } catch (Exception) {} } 
 //must be done completely. How do I ensure it? private static void WorkOnFile(string fileName) { while(true){ try{ using (FileStream f = File.Open(fileName, FileMode.Open, FileAccess.Read, FileShare.None)) { Thread.Sleep(40000); // some long operations break; //exit while() infinite loop } } catch(Exception e){ //file is locked because being written. wait a few seconds then retry Thread.Sleep(10000); } } }