TFileStream.Create - 打开读写但允许其他人只读

TFileStream.Create - Open read write but allow others to readonly

我遇到这样一种情况,我需要以只读模式打开一个文件,而同一个 exe 可能已经以 read/write 模式打开了同一个文件(网络共享)。我必须允许其他用户至少读取该文件。

EXE 将由许多不同的用户在他们的计算机上同时启动,指向同一个共享文件。

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

有什么办法可以解决这个问题吗?

在 read/write 模式下打开的代码

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

以只读模式打开的代码

TFileStream.Create(<file>, fmOpenRead);

根据 this table (do not look up the 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);

...如果你想成功。

为什么这是有道理的?因为当第三个调用者想要打开文件时,OS 不会维护第一个和第二个打开文件的时间顺序列表,因此不存在“第一个打开者比第二个打开者更正确”。如果第二个呼叫者将其从“全部共享”减少为“共享读取”,那么为什么第三个呼叫者应该坚持这一点而不是第一个呼叫者的“全部共享”模式?