如何在不关闭所有打开文件句柄的情况下重命名文件?
How to rename a file without closing all of it's open file handles?
我用 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
读取文件,有时另一个进程将需要 "swap" 文件,为此需要 重命名它
我是这样做的:
MoveFileA(aFileName, aNewFileName);
但是当我执行此操作时出现错误,因为它们仍然是一些打开的文件句柄。他们有什么方法可以在不先关闭所有 GENERIC_READ 文件句柄的情况下重命名文件吗?
只需添加 FILE_SHARE_DELETE 即可完成工作
打开另一个 HANDLE
文件,然后使用 SetFileInformationByHandle()
, setting the FileInformationClass
parameter to FileRenameInfo
, and the lpFileInformation
parameter to a pointer to a FILE_RENAME_INFO
结构。
显然首选是确保每次打开文件时,传递FILE_SHARE_DELETE
标志。
如果您不能这样做(例如,您无法控制的某些其他进程可能会打开它),剩下的替代方法是使用 MoveFileEx
和 MOVEFILE_DELAY_UNTIL_REBOOT
标志。正如您从名称中猜到的那样,它会等到下次计算机重新启动时再重命名。这对于服务等服务使用的文件特别有用,该服务会在服务启动时立即打开它们,并保持打开状态直到系统关闭。
虽然这确实有其自身的一些局限性。例如,您不能使用它通过网络共享重命名文件。重命名在引导过程的早期 公平地 完成,在持久网络共享 re-connected.
之前
我用 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
读取文件,有时另一个进程将需要 "swap" 文件,为此需要 重命名它
我是这样做的:
MoveFileA(aFileName, aNewFileName);
但是当我执行此操作时出现错误,因为它们仍然是一些打开的文件句柄。他们有什么方法可以在不先关闭所有 GENERIC_READ 文件句柄的情况下重命名文件吗?
只需添加 FILE_SHARE_DELETE 即可完成工作
打开另一个 HANDLE
文件,然后使用 SetFileInformationByHandle()
, setting the FileInformationClass
parameter to FileRenameInfo
, and the lpFileInformation
parameter to a pointer to a FILE_RENAME_INFO
结构。
显然首选是确保每次打开文件时,传递FILE_SHARE_DELETE
标志。
如果您不能这样做(例如,您无法控制的某些其他进程可能会打开它),剩下的替代方法是使用 MoveFileEx
和 MOVEFILE_DELAY_UNTIL_REBOOT
标志。正如您从名称中猜到的那样,它会等到下次计算机重新启动时再重命名。这对于服务等服务使用的文件特别有用,该服务会在服务启动时立即打开它们,并保持打开状态直到系统关闭。
虽然这确实有其自身的一些局限性。例如,您不能使用它通过网络共享重命名文件。重命名在引导过程的早期 公平地 完成,在持久网络共享 re-connected.
之前