【问题标题】:How to read a file that is in use by other process?如何读取其他进程正在使用的文件?
【发布时间】:2011-04-13 17:06:20
【问题描述】:

我有一个应用程序,它有一个日志系统,它创建一个文件并使用 TFileStream 处理它,它是通过这种方式创建的: FFileStream := TFileStream.Create(FFilename, fmOpenWrite);

好的。当我尝试用记事本打开这个文件时,没问题,用记事本++也没问题。当我尝试使用我创建的其他应用程序加载文件时,会引发一个错误,指出该文件正在被其他进程使用。 我试过 TStringList、LoadFromFile 和 TFileStream.Create(LFile, fmOpenRea);.

有人知道我如何像记事本和记事本++那样阅读它吗?

Tks.

【问题讨论】:

  • 您需要使用共享标志。将 fmShareDenyWrite 传递给构造函数。

标签: delphi winapi


【解决方案1】:

Erik 先到了那里,但使用 fmShareDenyNone 允许其他进程写入同一个文件。如果您只想允许其他进程读取,请使用:

FFileStream := TFileStream.Create(FFilename, fmOpenWrite or fmShareDenyWrite);

【讨论】:

  • 好的,如果我在我的服务器上设置它就可以运行,但是notepad和notepad++是如何做到的呢?
  • 他们这样做是为了确保他们使用共享选项,清楚地表明他们只打算读取文件,并允许其他进程在他们这样做时写入文件。为了实现这一点,他们使用fmOpenRead or fmShareDenyNone。有关共享选项的更多信息可以在帮助中找到,当然也可以在 MSDN 上找到,因为文件共享选项是文件系统的一部分,而文件系统又是操作系统的一部分。
  • 基本上,您使用共享选项来告诉文件系统您希望如何打开文件,以及当您打开文件时您将允许其他人做什么。如果该文件已被另一个进程使用,并且该进程设置的共享选项与您请求的不兼容,您的打开将失败。当您是第一个打开文件并且另一个进程使用与您不兼容的共享选项打开文件时,同样适用。
  • 马里安,我不明白。如果我不在服务器上设置此写入标志,我将无法访问该文件,无论我是否在我的第三个应用程序上设置了 fmShareDenyWrite,就像我在主题中所说的那样。所以要做到这一点,我需要修改这两个应用程序,但如果我使用记事本或记事本++,则没有必要。
  • 请记住,记事本不会保持文件打开。它打开它的时间仅够将其复制到内存或转储到磁盘。编辑时,记事本不会保留文件的任何句柄
【解决方案2】:

使用fmOpenWrite or fmShareDenyNone 启用共享。

【讨论】:

    【解决方案3】:

    我正在使用 Delphi7 并且我遇到过 TFileStream 有时无法打开文件进行读取,而只是锁定写入。 (在人们开始唠叨 TFileStream 类的共享参数之前;我知道它们,并正确设置它们。)虽然我还不能找出这种明显错误行为的原因,我发现它可以通过使用其他一些文件处理方式来解决:

    虽然无法使用 TFileStream 打开文件 - 即使使用正确的共享设置(是的,我知道我在做什么) - 可以使用适当的 WinAPI 调用轻松打开它:@987654321 @/ReadFile/SetFilePointer/CloseHandle 包裹在 Windows 单元中。

    【讨论】:

      猜你喜欢
      • 2013-08-11
      • 1970-01-01
      • 2020-07-05
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-04-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多