2011-02-11 101 views
30

目前,這是怎麼了,我打開一個文件來閱讀:打開文件只讀

using (TextReader reader = new StreamReader(Path.Combine(client._WorkLogFileLoc, "dump.txt"))) 
{ 
    //do stuff 
} 

我怎麼能打開以只讀模式文件,因此,如果另一進程同時打開的文件時間,我的程序仍然可以讀取它。

+0

你想在閱讀模式下打開流?或者你想設置文件屬性ReadOnly? – 2011-02-11 01:08:55

+0

想要打開它只讀 – xbonez 2011-02-11 01:11:42

+0

請注意,如果另一個進程打開該文件,該進程仍必須啓用讀共享才能夠讀取它。如果其他進程以共享被拒絕的方式打開文件,那麼即使以只讀方式打開文件也會被阻止。有關更多信息,請參閱FileShare枚舉(或Win32等效)。 – itowlson 2011-02-11 01:16:27

回答

73

典型的問題是,其他進程有文件打開寫入。所有標準的File方法和StreamReader構造函數都使用FileShare.Read打開文件。這是行不通的,否認寫分享。你不能否認寫作,另一個過程是第一個,並有寫入權限。所以你會被拒絕訪問。

你必須使用FileShare.ReadWrite,像這樣:

var fs = new FileStream(path, FileMode.Open, FileAccess.Read, FileShare.ReadWrite); 
using (var sr = new StreamReader(fs)) 
{ 
    // etc... 
} 

要小心,你仍然有一個棘手的問題,你正在閱讀半書面文件。其他進程在隨機時間點將數據刷新到文件中,您可能只讀取了半行文本。因人而異。

3

你可以通過調用File.SetAttributes

string path = Path.Combine(client._WorkLogFileLoc, "dump.txt"); 
FileAttributes curAttributes = File.GetAttributes(path); 
File.SetAttributes(path, curAttributes | FileAttributes.ReadOnly); 
11

如果你要打開的文件的只讀設置文件屬性,試試這個:

 using (TextReader reader = new StreamReader(File.OpenRead(Path.Combine(client._WorkLogFileLoc, "dump.txt")))) {  
     //do stuff 
    } 

通知調用File.OpenRead()

相關問題