读取另一个进程使用的文件[重复]

问题描述 投票:48回答:2

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

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

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

是否有解决此问题的好方法?

我应该执行以下操作吗?

  1. 监视文件
  2. 在更改时进行临时复制
  3. 读取临时副本
  4. 删除临时副本。

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

c# file-io file-locking
2个回答
103
投票

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

在这里猜测编码。您必须谨慎使用此类代码,其他程序正在积极地写入文件。您不会得到非常可靠的文件结尾指示,很有可能得到部分最后一行。当您继续读取文件以尝试获取程序附带的内容时,尤其麻烦。


14
投票

通话

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

只要其他应用程序未独占锁定文件,此方法就应该起作用。

© www.soinside.com 2019 - 2024. All rights reserved.