File.ReadLines 没有锁定它?
Posted
技术标签:
【中文标题】File.ReadLines 没有锁定它?【英文标题】:File.ReadLines without locking it? 【发布时间】:2011-07-17 08:15:03 【问题描述】:我可以打开一个 FileStream
new FileStream(logfileName, FileMode.Open, FileAccess.Read, FileShare.ReadWrite);
不锁定文件。
我可以对File.ReadLines(string path)
做同样的事情吗?
【问题讨论】:
The documentation 没有说明 ReadLines 的锁定行为。因此,即使您使用的 .net 框架的实现不会锁定文件,也不是您在开发应用程序时可以依赖的东西。 【参考方案1】:不...如果您使用 Reflector 查看,您会看到最后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:我不会将 ReSharper 描述为分析工具。我相信它现在也可以进行反编译(可能仅在 beta 版本中)。 如果它的行为对应于ReadLines
而不是ReadAllLines
,你为什么要调用你的方法ReadAllLines
?
@abatishchev 我的意思是反射器......我的错误......(我使用两者,但用于不同的目的)。但是从下一个版本(左右)开始,Resharper 将包含一个“类似反射器”的模块(这是因为反射器应该从 3 月份开始变成只收费的)。您甚至可以使用 ILSpy 或其他程序。
@CodeInChaos 因为 Visual Studio 没有将其标记为错误或警告(显然它不能认为愚蠢)......够了吗? :-) 我做了更正。【参考方案2】:
File.ReadLines()
将锁定文件直到完成。
【讨论】:
答案应该代表解决方案,或者至少应该看起来指向那个方向。寻求答案的人已经知道你断言的事实,所以它没有做任何有用的事情。以上是关于File.ReadLines 没有锁定它?的主要内容,如果未能解决你的问题,请参考以下文章