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

第一点:除非您采取措施阻止它,否则您报告的几乎所有内容都可能在您测试和您尝试根据该测试采取行动的时间之间发生变化(例如,在您尝试检查是否可以删除它之后,用户可能会将其更改为“只读”)。

为了获得有意义的结果,我将使用CreateFilewithFILE_SHARE_DELETEFILE_FLAG_DELETE_ON_CLOSE标志,而不是使用 DeleteFile 来删除文件。如果您无法以这种方式打开文件,它会提供一个很好的线索,即您将无法删除它。如果您可以以这种方式打开它,那么只需关闭句柄就会删除文件 - 除非它还指定FILE_SHARE_DELETE(即使这样做,当文件的最后一个句柄是关闭,文件将被删除,所以如果不立即删除,很快就会删除)。

于 2009-11-13T18:27:38.777 回答
0

I'm not a C++ programmer, but you could try to rename that file. If you can do that, you probably can delete it.

于 2009-11-13T17:08:25.200 回答