2

次の方法で「安全なファイルの上書き」を実装しようとしているアプリケーションがあります。

  1. ファイルの作成(A
  2. データ Aの入力
  3. 経由でA最終的な宛先( )にコピーするBSHFileOperation
  4. を使用して削除AするDeleteFile

ただし、ステップ4ではDeleteFile常にERROR_SHARING_VIOLATIONを返します。プロセス全体に数ミリ秒かかるため、他に誰が私のファイルに干渉するのか想像できません。いくつかの質問:

  1. 上記を実行するためのより良いWin32(C / C ++)テクニックはありますか?
  2. ファイルの削除を妨げている「その他のプロセス」に関する詳細情報を取得するにはどうすればよいですAか?
  3. どうすれば穏やかに(ウィンクウィンクナッジナッジ)Windowsに一時ファイルを削除させることができますか?

他の提案は大歓迎です

4

3 に答える 3

5

私の最善の推測は、ステップ2.5)で作成されたファイルハンドルを閉じる必要があることです。

ファイルを作成/開くために何を使用していますか?

CreateFileを使用する場合は、deleteを呼び出す前にファイルハンドルを閉じていることを確認するか、共有フラグを指定してくださいFILE_SHARE_DELETE

HANDLE hFile = CreateFile("C:\\test.txt", GENERIC_WRITE, FILE_SHARE_READ | FILE_SHARE_WRITE |  FILE_SHARE_DELETE, NULL, CREATE_ALWAYS, 0, NULL);

Win32 API CopyFileを使用して、ファイルコードのコピーを簡素化することもできます。

于 2009-09-15T00:45:56.257 に答える
1

ファイルを削除する1つの方法は、ファイルを開くことです。FILE_FLAG_DELETE_ON_CLOSEこれにより、ファイルの最後のハンドルが閉じられた後、OSがファイルを自動的に削除するように要求されます。でファイルを作成すると、FILE_SHARE_READそれSHFileOperationを読み取ってコピーできるはずです。そうすれば、すぐにファイルのハンドルを閉じることができます。シェルがファイルへのハンドルを閉じる、ファイルは自動的に削除されます。

于 2009-09-15T00:50:27.297 に答える
0
  • www.sysinternals.comのHandles.exeを使用して、ファイルが使用されているかどうか、およびどのように使用されているかを確認してください。

  • GetLastErrorおよびFormatMessageを使用して、最後に失敗した関数に関する詳細情報を取得できます。

いくつかのサンプルコード:

char tx2[1024];

DWORD l;

if(l = GetLastError())
{
    LPVOID lpMessageBuffer = 0;
    FormatMessage(
        FORMAT_MESSAGE_ALLOCATE_BUFFER | FORMAT_MESSAGE_FROM_SYSTEM,
        NULL,
        l,
        MAKELANGID(LANG_NEUTRAL, SUBLANG_DEFAULT), //The user default language
        (LPTSTR) &lpMessageBuffer,    
        0,
        NULL
    );

    SetLastError(0);
    MessageBox(NULL, tx2, "MyApplication", MB_ICONINFORMATION | MB_OK | (MB_SETFOREGROUND | MB_TOPMOST | MB_TASKMODAL));
}
于 2009-09-15T11:53:50.203 に答える