【问题标题】:C# FileSystemWatcher process already in useC# FileSystemWatcher 进程已在使用中
【发布时间】:2019-01-31 18:43:57
【问题描述】:

我正在使用FileSystemWatcher 来检测文件。一旦它检测到文件,我想读取内容并将其存储在一个字符串中。但是当试图阅读内容时,我得到的进程已经在使用中。

这是我的代码:

var watcher = new FileSystemWatcher(b);
watcher.EnableRaisingEvents = true;
watcher.Path = Path.GetDirectoryName(b + "CMDExec.txt");
watcher.Filter = Path.GetFileName(b + "CMDExec.txt");
watcher.Created += Watcher_Created;

private void Watcher_Created(object sender, FileSystemEventArgs e)
{
    string b = Path.GetTempPath();
    string text = System.IO.File.ReadAllText(b + "CMDExec.txt");
}

【问题讨论】:

  • 史蒂夫的回答很中肯,所以我不会提供额外的详细说明。但是,我认为将您指向最容易解决您的问题的思考过程很有用:See this Q&A 是一个很好的起点。

标签: c# filesystemwatcher system.io.file


【解决方案1】:

您必须了解文件 IO 锁在这种情况下是如何工作的。

让我们调用创建文件进程A的进程

进程 A 将首先创建文件并获取文件的排他锁以向其写入内容

一旦发生这种情况,您将收到一个文件创建事件,表明文件已创建。但是此时进程 A 仍然持有文件的排他锁,因为它还没有完成写入内容。

如果您可以直接访问写入器进程,您可以向您的程序发出一些信号,以表明文件已完成并可以使用。或者您将不得不进行一些错误处理以重试,直到您可以成功读取文件。

但请注意,您的读取将获取文件上的共享读取锁,以防止任何其他进程获取排他锁,直到读取完成。因此,如果进程 A 再次尝试以独占方式锁定文件,它将失败并且如果没有正确处理它可能会崩溃。

欢迎来到并发和竞争条件的世界!

【讨论】:

  • 有时我会质疑我的生活在做什么哈哈,谢谢你的帮助,我会好好研究一下。延迟会起作用吗?
  • @BestExploits 会有所帮助,但不能保证。如果原始进程在您的读取结束之前再次尝试访问该文件,它可能会遇到麻烦。所以这里没有明确的答案,一切都取决于你在做什么和 A 在做什么。
  • 好的,可以了!感谢您所做的一切,祝您有美好的白天/夜晚。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多