5

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
4

3 に答える 3

3

FileRenameInformation情報クラスでNtSetInformationFileを使用します。ハンドルは DELETE アクセスで開く必要があることに注意してください。

于 2013-01-22T09:39:33.337 に答える
2

API 呼び出しGetFinalPathNameByHandleを使用してファイル名を取得し、次にMoveFile API でファイルの名前を変更します。

ただし、ファイル名を取得した後にそのファイルを閉じる必要があると思います。そうしないと、移動/名前変更操作が失敗します

于 2013-01-18T16:34:16.477 に答える