在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',因为它正被另一个进程使用。”在这种情况下是否有任何变通方法?
答案 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();
答案 1 :(得分:8)
请注意,此共享模式也会对您的代码产生影响。您无法预测其他进程何时刷新文件。您阅读的最后一行可能只包含一行文本的一部分。当它再次刷新文件缓冲区时,稍后,您将获得该行的其余部分。显然,这可能会弄乱你的逻辑。
答案 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);
希望它有所帮助!