我有一个使用FileSystemWatcher
类监视目录以进行更改的程序。我有一些其他客户使用StreamWriter
写入此目录。 “有时”,在filesystemwatcher创建的事件中,当我尝试访问该文件时,出现错误。
这很难调试,因为它不经常发生。客户端通过将其封装在Using
块中来正确关闭流。该错误出现在“此应用程序无法使用该文件,因为它正被另一个进程使用”。我不太明白这一点,当客户端使用相同的代码将文件写入目录时,为什么错误只会偶尔出现。有时,手动复制会在大多数情况下发生错误。
有问题的目录不是网络目录,而是本地目录。请建议。
客户代码
using (StreamWriter ss = new StreamWriter(input)) {
ss.WriteLine(args(0));
ss.Close();
}
监控应用程序事件代码
public void Temp()
{
FileSystemWatcher fs = new FileSystemWatcher();
fs.Path = GlobalStatics.PathWorkOrders;
fs.IncludeSubdirectories = false;
fs.Filter = "*.wo";
fs.EnableRaisingEvents = true;
fs.Created += CreatedEvent;
}
public void CreatedEvent(object sender, System.IO.FileSystemEventArgs e)
{
string guidStr = Path.GetFileNameWithoutExtension(e.FullPath);
using (StreamReader sr = new StreamReader(e.FullPath))
{
//Processing
sr.Close();
}
}
答案 0 :(得分:3)
没有代码就很难,但我猜你会看到竞争条件。这是我认为大部分时间都在发生的事情。
FileSystemWatcher唤醒并处理该文件。
有时,由于您无法控制时间问题,订单会有所不同:
进程A正在使用StreamWriter更新文件,锁定文件。
进程A完成更新并关闭文件。
由于文件已被锁定,您的观察者无法处理该文件。
如果你得到那个例外,你应该稍后再试。
编辑:看完代码之后,我的回答仍然有意义。