62

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

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

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

有没有解决这个问题的好方法?

我应该执行以下操作吗?

  1. 监控文件
  2. 更改时制作一个临时副本
  3. 阅读临时副本
  4. 删除临时副本。

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

4

2 回答 2

138

如果记事本可以读取文件,那么您也可以,显然程序没有对文件设置读取锁定。您遇到的问题是 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
    //...
}

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

于 2012-03-18T17:58:47.547 回答
14

采用

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

只要其他应用程序没有专门锁定文件,这应该可以工作。

于 2012-03-18T15:54:47.900 回答