2011-03-17 47 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

相关问题