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 不会维护第一个和第二个打开文件的时间顺序列表,因此不存在“第一个打开者比第二个打开者更正确”。如果第二个呼叫者将其从“全部共享”减少为“共享读取”,那么为什么第三个呼叫者应该坚持这一点而不是第一个呼叫者的“全部共享”模式?
我遇到这样一种情况,我需要以只读模式打开一个文件,而同一个 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 不会维护第一个和第二个打开文件的时间顺序列表,因此不存在“第一个打开者比第二个打开者更正确”。如果第二个呼叫者将其从“全部共享”减少为“共享读取”,那么为什么第三个呼叫者应该坚持这一点而不是第一个呼叫者的“全部共享”模式?