2011-12-06 19 views
11

Windows API関数CreateFileを使用すると、目的のアクセスを特定できます。 3つのオプションread, write and deleteがあります。削除アクセスを要求するCreateFileからハンドルを取得した場合、返されたハンドルを使用してファイルを削除するにはどうすればよいですか? DeleteFile関数はハンドルではなくファイル名を使用します。オープンハンドルを使用してファイルを削除または名前を変更する

大きな画像: 私のアプリケーションからファイルを保存するときは、最初に一時ファイルに書き出してから、「本当の」ファイルを削除し、その一時ファイルの名前を本名に変更します。私は、検索インデクサー、またはアンチウイルス/スパイウェアでファイルを開いて読み込みを許可しても、削除を許可しないという問題を発見し始めました。これにより、ファイルを移動するときに保存が失敗します。私は開いているコードを変更して、削除のアクセス権を要求して保存するときにファイルを削除できることを確認しました。

これはすべて正常に動作しますが、サードパーティのアプリケーションが私のファイルを取得できるギャップがまだあります。私は一時ファイルと実ファイルの両方にオープンハンドルを持っているので、それらのハンドルを使って削除と名前変更の機能を実行する方法を探していました。私が見つけることができる唯一のオプションは、ハンドルを閉じ、DeleteFileとMoveFile関数を呼び出すことです。実際に私は現在、ReplaceFile API関数を使用してこれらのステップを実行していますが、ファイル名も渡されていて、ハンドルを最初に閉じるまでは機能しません。

私はまだXPをサポートする必要があり、新しいトランザクションファイル機能の使用を開始できません。ファイルをロックしたままにして、削除/名前を変更する方法はありますか?

答えて

6

Windows Vistaには、必要な機能を実行できる機能SetFileInformationByHandleがあります。

以前のバージョンのWindowsでは、このような機能はありませんが、それと同等のネイティブで、あまりパブリックな機能はありませんNtSetInformationFile

私はこれらの機能やそれらをテストするWindowsマシンを経験していないので、コードを表示することはできませんが、それほど難しいものではありません。

ネイティブのWindows機能に関する一般的な免責条項が当てはまります。

+0

ありがとう、それは私が必要としたものです。 –

関連する問題