即使在“正在使用另一个进程”异常时,如何读取文件?

时间:2010-12-09 16:22:48

标签: c# .net vb.net file-io

在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();

但是,上面引发了IO异常“进程无法访问文件'file.txt',因为它正被另一个进程使用。”在这种情况下是否有任何变通方法?

4 个答案:

答案 0 :(得分:67)

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();

Original source for code

答案 1 :(得分:8)

我会做鱼的。 FileShare模式至关重要,您必须允许写共享。这是不可否认的,因为正在编写文件的进程已经获得了写访问权限。 StreamReader()构造函数使用FileShare.Read,并且没有使用其他值的选项。相反,使用StreamReader(Stream)构造函数确实是变通方法。

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

答案 2 :(得分:4)

它取决于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);

答案 3 :(得分:2)

不确定这对于已打开的文件会如何表现,但这会阻止您的应用程序锁定它:

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

希望它有所帮助!