【问题标题】:Read a file that is locked (?) by a other process读取被其他进程锁定(?)的文件
【发布时间】:2014-04-29 19:26:09
【问题描述】:

我想读取由其他进程打开(并锁定?)的文件的内容。 我用File.ReadAllText()new StreamReader(new FileStream(path, FileMode.Open, FileAccess.Read)) 尝试过,但两种方法都会触发 IOException。

例如,我可以用 Notepad++ 打开文件并显示内容,所以我认为用 c# 也必须是可能的。

【问题讨论】:

  • IOException对象的异常信息是什么?
  • "进程无法访问文件'...',因为它被另一个进程使用了​​。"
  • 如果你也将FileShare.Read 传递给FileStream 构造函数(最后)会发生什么?
  • 同样的问题,@SimonWhitehead。

标签: c#


【解决方案1】:

您需要使用带有FileShare 参数的FileStream 构造函数重载。并通过FileShare.ReadWrite。如果您允许写访问,您只能打开该文件,因为其他程序已经获得了该权限。否则,到目前为止您的尝试失败的原因是,他们使用了 FileShare.Read。不能工作,你不能拒绝写访问,因为其他程序已经得到了。

在读取文件时处理写入文件的程序完全取决于您。结果可能非常随机。一切皆有可能,但一般来说,对于日志文件,您会得到一个部分写入的最后一行,它落后于程序的实际输出,其中一些仍然在程序的文件缓冲区中。 4096 字节的缓冲区大小是常见的选择。

【讨论】:

  • 如果使用其他进程FileShare.None 指定FileShare.ReadWrite 也没有意义,对吧?估计会失败?我说的对吗?
  • 使用 FileShare.ReadWrite 共享打开的文件肯定会有问题,因为任何应用程序(不仅仅是您自己的)都可以随时修改文件,这很容易搞砸您的应用程序。
  • 我猜它还是有道理的,只是行不通。 “无”意味着它所说的,没有其他人可以打开文件。如果文件与一个进程共享,ReadWrite 就已经存在问题,更多的进程并不能使它变得更好。但是,几乎所有应用程序都会使用 FileShare.Read 打开文件以写入文件,以防止其他应用程序也写入文件。这只是从来没有有一个好的结局。在推理 FileShare 值时,请务必颠倒角色以理解它们。
猜你喜欢
  • 2013-08-11
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-01-29
相关资源
最近更新 更多