我以前见过这个问题,但有很多答案,我不知道解决这个问题的最佳解决方案。
重启后,我的扫描仪运行正常。它扫描目录中的文本文件,它必须与文件做同样的事情。第一个文件始终有效但在第一个文件之后它变成了赌博
请帮忙
代码
FileSystemWatcher watcher = new FileSystemWatcher();
watcher.Path = @"C:\Data\IN";
watcher.NotifyFilter = NotifyFilters.LastAccess | NotifyFilters.LastWrite| NotifyFilters.FileName | NotifyFilters.DirectoryName;
watcher.Filter = "*.txt";
watcher.Created += new FileSystemEventHandler(OnChanged);
watcher.EnableRaisingEvents = true;
public void OnChanged(object source, FileSystemEventArgs e)
{
try
{
eventLog1.WriteEntry("Processing file : "+e.FullPath);
System.Collections.Generic.IEnumerable<String> lines = File.ReadAllLines(e.FullPath, System.Text.Encoding.Default);
System.Threading.Thread.Sleep(100);
if (File.Exists(Path.ChangeExtension(e.FullPath, ".old")))
File.Delete(Path.ChangeExtension(e.FullPath, ".old"));
File.Move(e.FullPath, Path.ChangeExtension(e.FullPath, ".old"));
}
catch (Exception ex)
{
eventLog1.WriteEntry("change : " + String.Concat(ex.Message, ex.StackTrace), EventLogEntryType.Error);
return;
}
}
错误是这样的:
cannot get access to file C:\Data\IN\kopie.txt because its beeing used by another proces.
答案 0 :(得分:0)
MSDN明确表示:
通用文件系统操作可能会引发多个事件。对于 例如,当一个文件从一个目录移动到另一个目录时,有几个 可能会引发OnChanged和一些OnCreated和OnDeleted事件。 移动文件是一个复杂的操作,由多个简单组成 操作,因此提出多个事件。同样,一些 应用程序(例如,防病毒软件)可能会导致其他问题 FileSystemWatcher检测到的文件系统事件。
这意味着你自己的操作可能会引发事件 - 你得到了事件 - 你移动文件 - 出现新事件 - 你试图在移动时读取它 - 例外。这是怎么回事。
另请勿使用System.Threading.Thread.Sleep(100);
。有时除了等待和检查之外没有其他方法可以检查条件,并且在.NET中没有直接的方法(我知道)更清楚地做到这一点 - Is there a way to check if a file is in use?。
但是你在处理程序中使用Sleep - 谁知道睡眠期间会发生什么以及如何改变。事件是你应该做出的反应,而不是你应该睡觉的东西(如果一次更改许多文件会怎么样 - 每个文件的处理时间至少需要0.1秒)。
我建议您创建一些事件队列并将其处理出事件。但你仍然必须了解哪些行动会引发什么事件 - 而且只能通过文档和实践来完成。