如何重命名文件而不关闭所有文件的打开文件句柄?

时间:2018-03-05 10:00:08

标签: windows winapi file-io createfile

我使用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文件句柄的情况下重命名文件?

3 个答案:

答案 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即可完成工作