如何在Windows上通过句柄重命名文件?

时间:2013-01-18 16:25:27

标签: c++ windows winapi

在Windows上,如何仅使用其句柄重命名文件?

我无法控制文件的打开方式(通过专有的第三方库完成)。但是我可以检索此文件的句柄(参见#1)。

我也知道专有库会打开具有以下属性的文件:

GENERIC_WRITE | GENERIC_READFILE_SHARE_WRITE | FILE_SHARE_READ

我尝试将SetFileInformationByHandle函数与FileRenameInfo一起用作参数。不幸的是,这似乎仅在使用DELETE访问类型打开文件时才起作用,而这种情况并非如此。

如果有办法做我想做的事,你有什么想法吗?

提前致谢。

#1:请注意,库不能直接访问文件句柄。但它给了我文件名和路径。然后我使用NtQuerySystemInformation和NtQueryObject函数检索句柄。 NtQuerySystemInformation允许我检索当前进程的所有句柄列表(使用SystemInformationClass参数的值16),然后我使用NtQueryObject查找库根据其文件路径打开的确切句柄。所以我没有打开一个单独的句柄。

/* Here is a basic pseudo-code demonstrating what I am trying to achieve */

library::Initialize(); //This creates a new file with a random name. The library keeps a handle opens internally until we call library::close.

file_info_struct tFileInfo;
library::GetFileInfo(tFileInfo); //This gives me information about the created file

HANDLE hFile = my::GetHandleFromFilePath(tFileInfo.file_path); //This function uses NtQuerySystemInformation and NtQueryObject functions to retrieve the existing handle

my::RenameFileByHandle(hFile, someNewFileName); //This is what I am missing. I do not know how to rename the file using its handle

//Carry on with using the library
....

library::close(); //This will close the internal file handle

3 个答案:

答案 0 :(得分:3)

使用API​​调用GetFinalPathNameByHandle获取文件名,然后使用MoveFile API重命名该文件。

但我认为你应该在获得文件名后关闭该文件,否则移动/重命名操作将失败

答案 1 :(得分:3)

NtSetInformationFileFileRenameInformation信息类一起使用。请注意,必须使用DELETE访问权限打开句柄。

答案 2 :(得分:2)

SetFileInformationByHandle,访问NtSetInformationFile的正确方法,Vista中的新功能。