-1

我有一个程序使用FileSystemWatcher该类监视目录的更改。我有一些其他客户使用StreamWriter. “有时”,在 filesystemwatcher created 事件中,当我尝试访问文件时,出现错误。

这很难调试,因为它不会经常发生。客户端通过将流封闭在一个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();
        }
    }
4

1 回答 1

3

没有代码有点难,但我猜你看到的是竞争条件。这是我认为大多数时候发生的事情。

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

    有时,由于您无法控制的时间问题,顺序会有些不同:

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

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

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

    如果您遇到该异常,您应该稍后再试一次。

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

于 2012-09-14T21:50:26.320 回答