【问题标题】:TFileStream.Create - Open read write but allow others to readonlyTFileStream.Create - 打开读写但允许其他人只读
【发布时间】:2021-12-10 14:29:47
【问题描述】:

当同一个 exe 可能已经在读/写模式下打开了同一个文件(网络共享)时,我需要以只读模式打开一个文件。我必须至少允许其他用户读取该文件。

许多不同的用户在他们的机器上指向同一个共享文件时会同时启动 EXE。

我正面临"Cannot open file '<file>'. The process cannot access the file because it is being used by another process" 错误。

有什么办法可以解决吗?

以读/写模式打开的代码

TFileStream.Create(<file>, fmOpenReadWrite or fmShareDenyNone);

以只读模式打开的代码

TFileStream.Create(<file>, fmOpenRead);

【问题讨论】:

  • 您是否尝试过fmOpenRead or fmShareDenyNone 用于只读文件?文档说:“共享模式必须是以下值之一”,因此必须有fmShare... consts之一。
  • 是的@TomBrunberg 有效

标签: file delphi pascal


【解决方案1】:

根据this table(不要查找current version with messed up layout semantics)第二次调用必须至少具有相同的共享:

First call to CreateFile Valid second calls to CreateFile
GENERIC_READ | GENERIC_WRITE with FILE_SHARE_READ | FILE_SHARE_WRITE GENERIC_READ with FILE_SHARE_READ | FILE_SHARE_WRITE
GENERIC_WRITE with FILE_SHARE_READ | FILE_SHARE_WRITE
GENERIC_READ | GENERIC_WRITE with FILE_SHARE_READ | FILE_SHARE_WRITE

这意味着:第二次调用必须至少共享相同的内容。所以你必须调用

TFileStream.Create('filename', fmOpenRead or fmShareDenyNone);

...如果你想成功。

为什么这有意义?因为当第三个调用者想要打开文件时,操作系统不会维护第一个和第二个打开文件的时间列表,因此没有“第一个开启者比第二个开启者更正确”。如果第二个调用者将其从“全部共享”降低到“共享读取”,那么为什么第三个调用者要坚持这一点,而不是第一个调用者的“全部共享”模式?

【讨论】:

    猜你喜欢
    • 2023-03-09
    • 1970-01-01
    • 2015-06-06
    • 2011-10-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-05-07
    • 1970-01-01
    相关资源
    最近更新 更多