Я запутался в следующей ситуации.
Мое приложение пытается найти указанный каталог:
HANDLE _dh, _fh; // Handles for a files
_dh = CreateFile( _ddn , GENERIC_READ , FILE_SHARE_READ | FILE_SHARE_WRITE , NULL , OPEN_EXISTING , FILE_ATTRIBUTE_DIRECTORY , NULL );
Если каталог не существует, приложение создает его:
if( _dh == INVALID_HANDLE_VALUE ) {
if( GetLastError() == ERROR_FILE_NOT_FOUND){
CreateDirectory( _ddn , NULL ); }
else {
CStringW _err;
DWORD _ed = GetLastError();
_err.Format( L" ERROR# %u", _ed );
MessageBox ( NULL , _err , L"123" , MB_OK );
PostQuitMessage(0);
return FALSE; } }
CloseHandle( _dh );
Это работает, но только в первый раз. Когда каталог уже существует, CreateFile завершается с ошибкой # 5: ACCESS DENIED, даже если приложение перезапускается.
Где моя ошибка?
ОБНОВИТЬ
Просто попытался создать целевую папку вручную — та же проблема.
CreateFile( _ddn , GENERIC_READ , FILE_SHARE_READ | FILE_SHARE_WRITE , NULL , OPEN_EXISTING , FILE_ATTRIBUTE_DIRECTORY , NULL );
Этот вызов всегда вызывает ERROR_ACCESS_DENIED
сообщение об ошибке (код ошибки 0x5).
От MSDN:
Чтобы открыть каталог с помощью CreateFile, укажите флаг FILE_FLAG_BACKUP_SEMANTICS как часть dwFlagsAndAttributes.
Так что измените на:
_dh = CreateFile( _ddn , GENERIC_READ , FILE_SHARE_READ | FILE_SHARE_WRITE , NULL , OPEN_EXISTING , FILE_FLAG_BACKUP_SEMANTICS , NULL );
вместо.
Не использовать FILE_ATTRIBUTE_DIRECTORY
, это даже не задокументировано.
Других решений пока нет …