C# FileSystemWatcher 进程已在使用中

C# FileSystemWatcher process already in use

我正在使用 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");
}

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

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

进程 A 会先创建文件并获取文件的独占锁来写入内容

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

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

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

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