【问题标题】:Using StreamWriter and FileSystemWatcher Together [closed]一起使用 StreamWriter 和 FileSystemWatcher [关闭]
【发布时间】:2012-09-14 21:41:25
【问题描述】:

我有一个使用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();
        }
    }

【问题讨论】:

  • 您能否显示您正在使用的代码,如果这是在 for 循环中完成的,您可能需要创建一个 StreamWriter 的实例,但如果没有看到您的代码就无法判断..
  • 这是不可避免的。您将等待一段时间再试一次。
  • 在 StreamReader 对象创建之前尝试使用 Thread.sleep(1000)!

标签: c# .net vb.net filesystemwatcher streamwriter


【解决方案1】:

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

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

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

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

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

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

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

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

【讨论】:

  • 曾几何时,我在一个进程中使用 FileSystemWatcher 并使用另一个进程写入时遇到了完全相同的问题。就像你说的,稍后重试加载文件是我遇到错误时需要做的解决错误。
猜你喜欢
  • 2017-11-27
  • 2013-05-06
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-03-10
  • 2012-05-30
  • 1970-01-01
  • 2014-03-03
相关资源
最近更新 更多