如何在不关闭所有打开文件句柄的情况下重命名文件?

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标志。

如果您不能这样做(例如,您无法控制的某些其他进程可能会打开它),剩下的替代方法是使用 MoveFileExMOVEFILE_DELAY_UNTIL_REBOOT 标志。正如您从名称中猜到的那样,它会等到下次计算机重新启动时再重命名。这对于服务等服务使用的文件特别有用,该服务会在服务启动时立即打开它们,并保持打开状态直到系统关闭。

虽然这确实有其自身的一些局限性。例如,您不能使用它通过网络共享重命名文件。重命名在引导过程的早期 公平地 完成,在持久网络共享 re-connected.

之前