2010-12-09 41 views
36

在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',因为它正在被另一个进程使用。“在这种情况下是否有任何解决方法?

回答

53
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

嗨,不知道是否有人会读这一点,也许我会更好地创造我自己的职位,但是...我试过这个解决方案,它仍然抛出错误,它正在被另一个进程使用。任何想法为什么会发生?干杯,戴夫。 – DavidC799 2014-11-08 15:40:50

+4

确保您拥有FileShare.ReadWrite,即使您只在阅读。这是我直到我来到这里才失去的魔力。 – yoyo 2015-01-27 20:56:44

1

不知道如何将一个已经打开的文件的行为,但是这会阻止应用程序锁定它:

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

希望它能帮助!

7

我会做鱼。 FileShare模式非常关键,您必须允许写入共享。这是不能被拒绝的,因为写入文件的过程已经获得写权限。 StreamReader()构造函数使用FileShare.Read,并且没有使用不同值的选项。使用StreamReader(Stream)构造函数实际上是解决方法。

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

3

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

您必须指定与另一个应用程序指定的模式非常相似的FileShare模式。如果其他应用程序只允许读取,则使用FileShare.Read;(如果它允许读取和写入),请使用FileShare.ReadWrite

StreamReader只使用FileShare.Read模式,所以你可以认为这不是正确的模式。因此,尝试读写,就像这样:

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