1

アンインストール手順中に使用して、事前にユーザーに警告したいと思います。この手順は W2000+ で機能するはずなので、Vista API は使用できません。

これはいくつかの競合をキャッチするようです:

if( GetFileAttributes( lpPath ) == INVALID_FILE_ATTRIBUTES )
{
    // File does not exist
}
else
{
    BOOL bCanDelete = FALSE ;
    HANDLE hFile = CreateFile( path, 
        GENERIC_WRITE /*|DELETE*/, 
        0 /*FILE_SHARE_DELETE*/, 
        NULL, 
        OPEN_EXISTING, 
        FILE_ATTRIBUTE_NORMAL, 
        NULL 
    );
    if( hFile != INVALID_HANDLE_VALUE )
    {
        DWORD size = 10000 ;  // a number > file size allowed
        if( size != INVALID_FILE_SIZE )
        {
            if( LockFile( hFile, 0,0, size,0) )
            {
                UnlockFile( hFile, 0,0, size,0) ;
                bCanDelete = TRUE ;
            }
        }
        CloseHandle( hFile ) ;
    }
}

つまり、次の状況を検出します: a) 実行中の exe ファイルの削除 b) 開いている pdf の削除

GENERIC_WRITE|DELETE を使用すると、同様に動作するようです。DELETE を単独で使用すると、b) の場合は機能しますが、a) の場合は機能しません。

LockFile() が意味のある競合を検出するという明確な証拠はありませんが、検出されたとします。

誰かがより良いアイデアを持っていますか?

4

2 に答える 2

1

最初のポイント: 防止策を講じない限り、テストを行ってから、そのテストに基づいてアクションを実行しようとするまでの間 (たとえば、削除できることを確認しようとした後、ユーザーはそれを「読み取り専用」に変更する可能性があります)。

意味のある結果を得るには、DeleteFile を使用してファイルを削除する代わりに、CreateFilewithFILE_SHARE_DELETEFILE_FLAG_DELETE_ON_CLOSEフラグを使用します。この方法でファイルを開くことができない場合は、ファイルを削除できないというかなり良い手がかりが得られます。この方法で開くことができる場合、ハンドルを閉じるだけでファイルが削除されます-指定されていない限り、その間は何も開くことができませんFILE_SHARE_DELETE(指定したとしても、ファイルへの最後のハンドルが閉じるとファイルが削除されるので、すぐに削除しないとすぐに削除されます)。

于 2009-11-13T18:27:38.777 に答える
0

私は C++ プログラマーではありませんが、そのファイルの名前を変更してみてください。それができれば、おそらく削除できます。

于 2009-11-13T17:08:25.200 に答える