C# 同时使用StreamWriter和FileSystemWatcher
我有一个使用FileSystemWatcher类监视目录更改的程序。我有一些其他客户端使用StreamWriter写入此目录。有时,在filesystemwatcher创建的事件中,当我尝试访问该文件时,会出现错误 这很难调试,因为它并不经常发生。客户端通过将流封装在Using块中来正确关闭流。错误在该应用程序的行上,无法使用该文件,因为其他进程正在使用该文件。我不太明白这一点,当客户端使用相同的代码将文件写入目录时,为什么错误只是偶尔出现。有时,手动复制会在大多数情况下出错 该目录不是网络目录,而是本地目录。请建议 客户端代码C# 同时使用StreamWriter和FileSystemWatcher,c#,.net,vb.net,filesystemwatcher,streamwriter,C#,.net,Vb.net,Filesystemwatcher,Streamwriter,我有一个使用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();
}
}
没有代码有点难,但我想你看到了一个比赛条件。我相信大多数时候都是这样 进程A正在使用StreamWriter更新文件,并锁定该文件。 进程A完成更新并关闭文件。 FileSystemWatcher将唤醒并处理该文件 有时,由于无法控制的时间问题,顺序有些不同: 进程A正在使用StreamWriter更新文件,并锁定该文件 FileSystemWatcher将唤醒并处理该文件。 进程A完成更新并关闭文件 由于文件已锁定,您的观察者无法处理它 如果出现异常,您应该稍后再试
编辑:看了代码之后,我的答案仍然有意义。你能展示你正在使用的代码吗?如果这是在for循环中完成的,那么你可能需要创建StreamWriter的实例,但如果没有看到你的代码就无法判断。这是不可避免的。您将等待一段时间,然后重试。在创建StreamReader对象之前,请尝试使用Thread.sleep1000!曾几何时,我在一个进程中使用FileSystemWatcher和在另一个进程中编写时遇到了完全相同的问题。正如您所说,稍后再尝试加载文件是我遇到错误时需要解决的问题。