FileSystemWatcher - 无法读取创建的文件

时间:2015-02-03 14:50:56

标签: c# file-watcher

我最近开始使用FileSystemWatcher。我需要监视某个目录,添加到该目录的任何新文件都会获得MD5校验和并在控制台中显示它。所以我添加了相应的事件处理程序

watcher.Created += new FileSystemEventHandler(OnCreated);

然后OnCreated看起来像

private static void OnCreated(object sender, FileSystemEventArgs e)
  {
      using (var md5 = MD5.Create())
      {
          using (var stream = File.OpenRead("C:\\Test\\Uploads\\"+ e.Name))
          {
              byte[] checkSum = md5.ComputeHash(stream);

              StringBuilder sb = new StringBuilder();
              for (int i = 0; i < checkSum.Length; i++)
              {
                  sb.Append(checkSum[i].ToString());
              }

              Console.WriteLine(sb.ToString());
          }
      }
  }

创建第一个文件时,这非常正常,但是只要在目录中创建了另一个文件,我就会收到以下错误

  

其他信息:进程无法访问文件&#39; C:\ Test \ Uploads \ New Text Document(2).txt&#39;因为它正被另一个进程使用

抛出错误的行是

using (var stream = File.OpenRead("C:\\Test\\Uploads\\"+ e.Name))

我也试过stream.Dispose();,但也有同样的问题。有谁知道我哪里出错了?提前感谢您的所有帮助和支持。

1 个答案:

答案 0 :(得分:2)

如上所述,尝试使用重试

进行简单的超时
        using (var md5 = MD5.Create())
        {
            int retries = 10;
            while (retries > 0)
            {
                try
                {
                    using (var stream = File.OpenRead("C:\\Test\\Uploads\\" + e.Name))
                    {
                        byte[] checkSum = md5.ComputeHash(stream);

                        StringBuilder sb = new StringBuilder();
                        for (int i = 0; i < checkSum.Length; i++)
                        {
                            sb.Append(checkSum[i].ToString());
                        }
                    }
                    // All done, leave the loop
                    break;
                }
                catch (FileNotFoundException e)
                {
                    // Check for your specific exception here
                    retries--;
                    Thread.Sleep(1000);
                }
            }
            // Do some error handling if retries is 0 here
        }

请注意,在Catch块中,您必须正确检查特定错误。在任何其他情况下,您都希望处理异常。