Я хочу использовать его во время процедуры удаления, чтобы предупредить пользователя.
Процедура должна работать для 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 ) ;
}
}
А именно он обнаруживает следующие ситуации:
а) Удаление запущенного exe-файла
б) Удаление открытого pdf
Использование GENERIC_WRITE | DELETE ведет себя аналогично.
Использование только DELETE работает для случая б), но не для а).
У меня нет никаких положительных доказательств того, что LockFile () отлавливает какой-либо значимый конфликт, но предположим, что это так.
У кого-нибудь есть идея получше?