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&lt;string&gt;(如果文件有数千行并且您一次只需要解析它们,那会更好)。如果您需要一个数组,请使用 LINQ 将其称为 ReadLines("myfile").ToArray()

请注意,从逻辑上讲,如果文件“在(方法的)背后”发生更改,那么一切将如何工作是完全不确定的(它可能在技术上已定义,但定义可能相当长且复杂)

【讨论】:

ReSharper 是一个分析工具,在这种情况下应该使用 Reflector @abatishchev:我不会将 ReSharper 描述为分析工具。我相信它现在也可以进行反编译(可能仅在 beta 版本中)。 如果它的行为对应于ReadLines而不是ReadAllLines,你为什么要调用你的方法ReadAllLines @abatishchev 我的意思是反射器......我的错误......(我使用两者,但用于不同的目的)。但是从下一个版本(左右)开始,Resharper 将包含一个“类似反射器”的模块(这是因为反射器应该从 3 月份开始变成只收费的)。您甚至可以使用 ILSpy 或其他程序。 @CodeInChaos 因为 Visual Studio 没有将其标记为错误或警告(显然它不能认为愚蠢)......够了吗? :-) 我做了更正。【参考方案2】:

File.ReadLines() 将锁定文件直到完成。

【讨论】:

答案应该代表解决方案,或者至少应该看起来指向那个方向。寻求答案的人已经知道你断言的事实,所以它没有做任何有用的事情。

以上是关于File.ReadLines 没有锁定它?的主要内容,如果未能解决你的问题,请参考以下文章

文件操作基础知识

文件和异常 Python

用户三次登陆密码错误锁定

File.ReadLines 啥时候释放资源

login加注释

Python_usetxt