【发布时间】:2015-02-03 14:50:56
【问题描述】:
我最近开始使用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());
}
}
}
当创建第一个文件时,这工作得很好,但是一旦在目录中创建另一个文件,我就会收到以下错误
附加信息:进程无法访问文件 'C:\Test\Uploads\New Text Document (2).txt',因为它正被另一个进程使用
抛出错误的行是
using (var stream = File.OpenRead("C:\\Test\\Uploads\\"+ e.Name))
我也尝试过stream.Dispose();,但遇到了同样的问题。有谁知道我要去哪里错了?提前感谢您的所有帮助和支持。
【问题讨论】:
-
也许它正被 另一个 进程使用 - 也许文件没有被创建/写入?
-
e.Name 是否总是包含新创建文件的名称?
-
@silent 是的,它总是有新创建文件的名称
-
hm,您是否尝试过在尝试打开文件之前插入几秒钟的睡眠?也许您的事件处理程序被触发并且文件尚未完全创建
-
@dariogriffo 感谢您提供的信息,但我更愿意在没有
Thread.Sleep(1000)的情况下使用它。出于我的原因,您可以参考this 答案
标签: c# file-watcher