2010-12-09 53 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); 
相關問題