如何检查是否可以删除文件

时间:2009-11-13 16:57:11

标签: file visual-c++ delete-file

我想在卸载过程中使用它来提前警告用户。 该程序适用于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()捕获任何有意义的冲突,但假设它确实存在。

有没有人有更好的主意?

2 个答案:

答案 0 :(得分:1)

第一点:除非你采取措施防止它,否则你报告的几乎任何事情都可能在你测试的时间和你尝试根据测试采取行动的时间之间发生变化(例如,在你试图检查你能做到之后)删除它,用户可能会将其更改为“只读”。)

要获得有意义的结果,我会使用带有CreateFile的{​​{1}}和FILE_SHARE_DELETE标记,而不是使用DeleteFile删除文件。如果你不能以这种方式打开文件,它会提供一个很好的线索,你将无法删除它。如果你可以用这种方式打开它,那么只需关闭句柄就会删除文件 - 除非它还指定FILE_FLAG_DELETE_ON_CLOSE,否则其他任何东西都无法在临时中打开它(即使它已经指定FILE_SHARE_DELETE该文件的句柄被关闭,该文件将被删除,因此如果它没有被立即删除,它将很快被删除。

答案 1 :(得分:0)

我不是C ++程序员,但您可以尝试重命名该文件。如果你能做到这一点,你可能会删除它。