new FileStream(logfileName, FileMode.Open, FileAccess.Read, FileShare.ReadWrite);
打开FileStream不锁定文件。
我可以这样做File.ReadLines(string path)
?
new FileStream(logfileName, FileMode.Open, FileAccess.Read, FileShare.ReadWrite);
打开FileStream不锁定文件。
我可以这样做File.ReadLines(string path)
?
不......如果用反射看,你会看到,到底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()
。
从逻辑上说,如果文件在其“背后(方法)”改变,那么所有的工作如何都是不确定的(它可能是技术上定义的,但定义可能很长且很复杂)
就ReSharper是一个剖析工具而言,在这种情况下应该使用Reflector – abatishchev 2011-03-17 11:49:08
@abatishchev:我不会将ReSharper描述为剖析工具。我相信它现在也可以进行反编译(可能只是在beta版本中)。 – 2011-03-17 11:50:25
如果行为对应于“ReadLines”而不是“ReadAllLines”,为什么要调用方法'ReadAllLines'? – CodesInChaos 2011-03-17 11:51:49
File.ReadLines()
将锁定文件直到完成。
答案应该代表解决方案,或者至少似乎应该指向这个方向。回答探索者已经知道你声称的事实,所以它没有任何帮助。 – 2016-05-04 05:55:58
[文档](http://msdn.microsoft.com/en-us/library/dd383503.aspx)没有提到有关ReadLines的锁定行为的任何信息。因此,即使您使用的.net框架的实现不会锁定文件,也不是您在开发应用程序时可以依赖的东西。 – Heinzi 2011-03-17 11:40:39