即使在得到“正在被另一个进程使用”exception的情况下,我如何才能读取文件?

在VB.NET或C#中,我试图读取另一个程序正在使用的文本文件的内容(这就是说,实际上,我不能停止程序或停止写入文本文件,我想定期读出在另一个程序中的文本文件中的当前内容)。

这是我正在使用的代码(VB.NET)

Dim strContents As String Dim objReader As StreamReader objReader = New StreamReader(FullPath) strContents = objReader.ReadToEnd() objReader.Close() 

或在C#中:

 var objReader = new StreamReader(FullPath); var strContents = objReader.ReadToEnd(); objReader.Close(); 

但是,上述情况会引发IOexception“进程无法访问文件'file.txt',因为它正被另一个进程使用。 在这种情况下是否有任何解决方法?

 FileStream logFileStream = new FileStream("c:\test.txt", FileMode.Open, FileAccess.Read, FileShare.ReadWrite); StreamReader logFileReader = new StreamReader(logFileStream); while (!logFileReader.EndOfStream) { string line = logFileReader.ReadLine(); // Your code here } // Clean up logFileReader.Close(); logFileStream.Close(); 

代码的原始来源

我会做鱼。 FileShare模式非常重要,您必须允许写入共享。 这是不能否认的,因为正在写入文件的进程已经获得了写入权限。 StreamReader()构造函数使用FileShare.Read,并且没有使用不同值的选项。 使用StreamReader(Stream)构造函数确实是解决方法。

但是请注意,这种共享模式也会影响您的代码。 您无法预测其他进程刷新文件的时间。 您阅读的最后一行可能只包含一行文本的一部分。 当它刷新的时候是文件缓冲区,稍后,你会得到该行的其余部分。 显然这可能会弄乱你的逻辑。

它取决于FileShare模式,该文件由附加到文件的其他应用程序打开。 当另一个应用程序正在打开文件时,它为其他应用程序指定了一个FileShare模式来访问该文件。 这个FileShare模式可能已被读取,写入,都删除,所有这些,或没有

您必须指定与其他应用程序指定的FileShare模式相同的FileShare模式。 如果其他应用程序只允许读取,请使用FileShare.Read; 如果它允许读取和写入,请使用FileShare.ReadWrite

StreamReader只使用FileShare.Read模式,所以你可以认为这不是正确的。 因此,请尝试ReadWrite,如下所示:

 FileStream fs = new FileStream(FullPath, FileMode.Open, FileAccess.Read, FileShare.ReadWrite); StreamReader reader = new StreamReader(fs); 

不知道这将如何与已经打开的文件,但这将阻止你的应用程序locking它:

 FileStream fs = new FileStream(fileName, FileMode.Open, FileAccess.Read, FileShare.ReadWrite); StreamReader sr = new StreamReader(fs); 

希望它有帮助!