目录扫描程序不稳

时间:2014-06-24 17:50:56

标签: c# events io

我以前见过这个问题,但有很多答案,我不知道解决这个问题的最佳解决方案。

重启后,我的扫描仪运行正常。它扫描目录中的文本文件,它必须与文件做同样的事情。第一个文件始终有效但在第一个文件之后它变成了赌博

请帮忙

代码

    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.   

1 个答案:

答案 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秒)。

我建议您创建一些事件队列并将其处理出事件。但你仍然必须了解哪些行动会引发什么事件 - 而且只能通过文档和实践来完成。