2012-03-18 17 views
32

我在監視正在由服務器程序寫入的文本文件。每次更改文件時,內容都會輸出到我的程序中的一個窗口中。讀取另一個進程使用的文件

的問題是,因爲它是被used by another process我不能在文件中使用Streamreader。使用ReadWrite設置Filestream將無濟於事,因爲我無法控制正在使用該文件的進程。

我可以在記事本中打開該文件。即使服務器正在使用它,也必須能夠訪問它。

有沒有解決這個好辦法?

我應該做到以下幾點?

  1. 監控文件
  2. 做它的一個臨時副本時,它改變
  3. 閱讀的臨時副本
  4. 刪除臨時副本。

我需要的文本文件中,每當服務器更改它。

回答

67

如果記事本可以讀取該文件,然後這樣,可以清楚地計劃並沒有把讀鎖在文件上。您遇到的問題是StreamReader將使用FileShare.Read打開文件。其中拒絕寫入權限。這是行不通的,另一個程序已經獲得寫權限。

你需要創建StreamReader的是這樣的:

using (var fs = new FileStream(path, FileMode.Open, FileAccess.Read, FileShare.ReadWrite)) 
using (var sr = new StreamReader(fs, Encoding.Default)) { 
    // read the stream 
    //... 
} 

在編碼猜測這裏。你必須小心這種代碼,另一個程序正在寫入文件。你不會得到一個非常可靠的結束文件指示,獲得最後一行很有可能。特別是當你繼續閱讀文件以獲取任何附加程序時會遇到麻煩。

+2

謝謝......我沒有意識到FileShare.Read在這種情況下會不正確。 – 2014-07-06 12:46:03

+2

通過使用'FileShare.ReadWrite | FileShare.Delete'你可以訪問更多數量的文件。 「FileShare.ReadWrite」不夠時值得一試 – Adassko 2016-04-22 13:24:45

+0

@Adassko或者當'FileShare.Read'還不夠時,就像在這種情況下一樣,在我的特殊情況下,我在同一類代碼中使用它,以及必須切換到'FileShare.ReadWrite'才能使其工作。 – vapcguy 2017-11-16 21:54:45

10

呼叫

File.Open(path, FileMode.Read, FileAccess.Read, FileShare.ReadWrite) 

與其他應用程序沒有鎖定該文件僅僅這應該作爲長期的工作。

+0

謝謝。這是否與流媒體播放器結合使用?就像這樣: File.Open(路徑,FileMode.Read,FileAccess.Read,FileShare.ReadWrite); StreamReader reader = new StreamReader(path); – Christoffer 2012-03-18 16:05:32

+0

@Tophe:當然。 IIRC,StreamReader也可以直接使用這些參數。 – SLaks 2012-03-18 16:06:18

+0

那會怎樣?如果我將FileMode.Open,FileAccess.Read,FileShare.ReadWrite作爲參數放到Streamreader中,它將不起作用。它說它只需要一些編碼參數。 – Christoffer 2012-03-18 16:10:38

相關問題