Не могу получить доступ к каталогу, созданному CreateDirectory

Я запутался в следующей ситуации.
Мое приложение пытается найти указанный каталог:

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).

2

Решение

От 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, это даже не задокументировано.

3

Другие решения

Других решений пока нет …