我使用GENERIC_READ
创建createFile
文件句柄。
这是我的指示:
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文件句柄的情况下重命名文件?
答案 0 :(得分:2)
显然,首选的选择是确保每次打开文件时都会传递FILE_SHARE_DELETE
标志。
如果你不能这样做(例如,你无法控制的其他一些过程可能会打开它),剩下的选择是使用带有MoveFileEx
标志的MOVEFILE_DELAY_UNTIL_REBOOT
。正如您从名称中猜到的那样,这会等到下次重新启动计算机时再重新命名。这对于服务启动时打开它们的服务所使用的文件特别有用,并且在系统关闭之前保持打开状态。
但这确实有一些局限性。例如,您无法使用它通过网络共享重命名文件。在重新连接持久网络共享之前,重命名在引导过程的早期相当完成。
答案 1 :(得分:0)
打开该文件的另一个HANDLE
,然后使用SetFileInformationByHandle()
,将FileInformationClass
参数设置为FileRenameInfo
,将lpFileInformation
参数设置为指向a的heap.index( wKeys )
参数FILE_RENAME_INFO
结构。
答案 2 :(得分:-1)
只需添加FILE_SHARE_DELETE即可完成工作