Windowsで、ハンドルのみを使用してファイルの名前を変更するにはどうすればよいですか?
私はファイルを開く方法を制御していません(独自のサードパーティライブラリを介して行われます)。ただし、このファイルへのハンドルを取得できます(#1を参照)。
また、プロプライエタリライブラリが次の属性でファイルを開くことも知っています。
GENERIC_WRITE | GENERIC_READ
およびFILE_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