【发布时间】:2018-03-05 10:00:08
【问题描述】:
我用createFile 创建GENERIC_READ 文件句柄。
这是我的指示:
hfile := CreateFileA(aFileName,
GENERIC_READ,
FILE_SHARE_READ or
FILE_SHARE_WRITE,
nil,
OPEN_EXISTING,
FILE_ATTRIBUTE_NORMAL or
FILE_FLAG_SEQUENTIAL_SCAN or
FILE_FLAG_OVERLAPPED,
0);
现在的问题是,何时进程将通过hfile 读取文件,有时另一个进程需要“交换”文件,为此需要重命名它
这就是我的做法:
MoveFileA(aFileName, aNewFileName);
但是当我这样做时他们仍然有一些文件句柄打开时我有一个错误。他们有什么方法可以在不先关闭所有 GENERIC_READ 文件句柄的情况下重命名文件吗?
【问题讨论】:
-
:=- 你又在编程什么? -
@StoryTeller Delphi 和 C++(这里的代码示例来自 delphi)
-
这似乎是一个德尔福赋值运算符。
-
是的,当我进一步阅读并看到
nil时,我很明智。那么,我对您问题中的 C++ 标记感到矛盾。它不是 C++ 特定的,是吗?甚至不是特定于 Delphi,但至少代码是 Delphi。 -
MoveFile通过NtOpenFile打开句柄并通过NtSetInformationFile进行重命名。重命名文件本质上是从其当前目录中删除,因此它需要删除访问权限,这是一种共享访问权限(请参阅IoCheckShareAccess)。在文件系统的文件/流控制块中有一个SHARE_ACCESS记录,供所有引用 FCB/SCB 的内核文件对象使用。
标签: windows winapi file-io createfile