【问题标题】:Reading a file used by another process [duplicate]读取另一个进程使用的文件[重复]
【发布时间】:2012-03-18 15:51:04
【问题描述】:

我正在监视一个服务器程序正在写入的文本文件。每次更改文件时,内容都会输出到我程序中的一个窗口。

问题是我不能在文件上使用Streamreader,因为它是used by another process。用ReadWrite 设置Filestream 不会有任何好处,因为我无法控制正在使用该文件的进程。

我可以在记事本中打开文件。即使服务器正在使用它,也必须可以访问它。

有什么好的办法吗?

我应该执行以下操作吗?

  1. 监控文件
  2. 当它发生变化时制作一个临时副本
  3. 读取临时副本
  4. 删除临时副本。

每当服务器更改文件时,我都需要获取文件中的文本。

【问题讨论】:

    标签: c# file-io file-locking


    【解决方案1】:

    如果记事本可以读取文件,那么你也可以,显然程序没有对文件设置读取锁。您遇到的问题是 StreamReader 将使用 FileShare.Read 打开文件。拒绝写访问。这不行,其他程序已经获得了写权限。

    您需要像这样创建 StreamReader:

    using (var fs = new FileStream(path, FileMode.Open, FileAccess.Read, FileShare.ReadWrite))
    using (var sr = new StreamReader(fs, Encoding.Default)) {
        // read the stream
        //...
    }
    

    在这里猜测编码。你必须小心这种代码,其他程序正在积极写入文件。你不会得到一个非常可靠的文件结束指示,得到部分最后一行是很有可能的。当您继续阅读文件以尝试获取程序附加的任何内容时尤其麻烦。

    【讨论】:

    • 谢谢...我没有意识到 FileShare.Read 在这种情况下是不正确的。
    • 通过使用FileShare.ReadWrite | FileShare.Delete,您可以获得更多文件的访问权限。 FileShare.ReadWrite不够用的时候也值得一试
    • @Adassko 或者当FileShare.Read 不够时,例如在这种情况下,在我的特殊情况下,我在相同类型的代码中使用它,不得不切换到FileShare.ReadWrite让它工作。
    • @Adassko 感谢您的评论这有助于解决另一个问题,使用 EPPlus(.NET Excel 文件读取器/写入器)我确实需要使用“FileShare.ReadWrite | FileShare.Delete”来阅读打开Excel 文件,否则我会收到错误并且无法读取文件。这解决了谢谢!
    【解决方案2】:

    使用

    File.Open(path, FileMode.Open, FileAccess.Read, FileShare.ReadWrite);
    

    只要其他应用程序没有以独占方式锁定文件,这应该可以工作。

    【讨论】:

    • 谢谢。这将与流式阅读器结合使用吗?像这样: File.Open(path, FileMode.Read, FileAccess.Read, FileShare.ReadWrite); StreamReader reader = new StreamReader(path);
    • @Tophe:当然。 IIRC,StreamReader ctor 也可以直接取这些参数。
    • 看起来怎么样?如果我将 FileMode.Open、FileAccess.Read、FileShare.ReadWrite 作为参数放入 Streamreader,它将无法工作。它说它只需要一些编码参数。
    • 那我记错了。对不起。
    • FileMode.Read 不存在
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2010-10-12
    • 1970-01-01
    • 2016-08-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多