3

我对以下情况感到困惑。我的应用程序尝试查找指定目录:

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 错误代码)。

4

1 回答 1

4

来自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,它甚至没有记录。

于 2012-11-13T23:26:35.510 回答