一起使用StreamWriter和FileSystemWatcher

时间:2012-09-14 21:41:25

标签: 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();
        }
    }

1 个答案:

答案 0 :(得分:3)

没有代码就很难,但我猜你会看到竞争条件。这是我认为大部分时间都在发生的事情。

  • 进程A正在使用StreamWriter更新文件,锁定文件。
  • 进程A完成更新并关闭文件。
  • FileSystemWatcher唤醒并处理该文件。

    有时,由于您无法控制时间问题,订单会有所不同:

  • 进程A正在使用StreamWriter更新文件,锁定文件。

  • FileSystemWatcher唤醒并处理该文件。
  • 进程A完成更新并关闭文件。

    由于文件已被锁定,您的观察者无法处理该文件。

    如果你得到那个例外,你应该稍后再试。

编辑:看完代码之后,我的回答仍然有意义。