2011-03-17 45 views
14

我可以File.ReadLines不鎖定它?

new FileStream(logfileName, FileMode.Open, FileAccess.Read, FileShare.ReadWrite); 

打開FileStream不鎖定文件。

我可以這樣做File.ReadLines(string path)

+5

[文檔](http://msdn.microsoft.com/en-us/library/dd383503.aspx)沒有提到有關ReadLines的鎖定行爲的任何信息。因此,即使您使用的.net框架的實現不會鎖定文件,也不是您在開發應用程序時可以依賴的東西。 – Heinzi 2011-03-17 11:40:39

回答

31

不......如果用反射看,你會看到,到底File.ReadLines打開FileStream(path, FileMode.Open, FileAccess.Read, FileShare.Read, 0x1000, FileOptions.SequentialScan);

所以只讀共享。

(在技術上打開與FileStream一個StreamReader如上所述)

我會補充說這似乎是孩子們的遊戲製作一個靜態方法來做到這一點:

public static IEnumerable<string> ReadLines(string path) 
{ 
    using (var fs = new FileStream(path, FileMode.Open, FileAccess.Read, FileShare.ReadWrite, 0x1000, FileOptions.SequentialScan)) 
    using (var sr = new StreamReader(fs, Encoding.UTF8)) 
    { 
     string line; 
     while ((line = sr.ReadLine()) != null) 
     { 
      yield return line; 
     } 
    } 
} 

這將返回一個IEnumerable<string>(如果該文件包含數千行,並且您只需要一次解析它們,那麼該文件會更好)。如果您需要一個數組,請使用LINQ將其稱爲ReadLines("myfile").ToArray()

從邏輯上說,如果文件在其「背後(方法)」改變,那麼所有的工作如何都是不確定的(它可能是技術上定義的,但定義可能很長且很複雜)

+0

就ReSharper是一個剖析工具而言,在這種情況下應該使用Reflector – abatishchev 2011-03-17 11:49:08

+0

@abatishchev:我不會將ReSharper描述爲剖析工具。我相信它現在也可以進行反編譯(可能只是在beta版本中)。 – 2011-03-17 11:50:25

+1

如果行爲對應於「ReadLines」而不是「ReadAllLines」,爲什麼要調用方法'ReadAllLines'? – CodesInChaos 2011-03-17 11:51:49

2

File.ReadLines()將鎖定文件直到完成。

+1

答案應該代表解決方案,或者至少似乎應該指向這個方向。回答探索者已經知道你聲稱的事實,所以它沒有任何幫助。 – 2016-05-04 05:55:58

相關問題