2

我有一个用于创建目录的函数。它使用 CreateDirectoryA()

CreateDirectory 报告它失败,但是当我使用 GetLastError() 检查错误代码时,它报告 ERROR_SUCCESS

代码:

BOOL isDirCreated = CreateDirectoryA(dirName.c_str(), NULL);
DWORD dw = GetLastError();
if (isDirCreated) {
        if (!SetFileAttributesA(dirName.c_str(), attributes)) {
            printf("SetFileAttributes() %s failed with (%d)", dirName.c_str(), GetLastError()));
            return;
        }
    } else {
        printf("CreateDirectory() %s Failed with (%d)", dirName.c_str(), dw));
        if(ERROR_ALREADY_EXISTS != dw) {
            return;
        }
    }

这将返回:(对函数的多次调用)

CreateDirectory() testDir Failed with (0)
CreateDirectory() testDir\dir Failed with (183)

即使 CreateDirectoryA 返回 false,也会创建目录。失败总是发生在第一次调用该函数时。所有后续调用都按预期工作。

为什么 CreateDirectory 在成功创建目录时会返回 false 的任何想法。

这是一个类似的帖子,但该解决方案对我不起作用:

ReadFile() 表示失败,但错误代码为 ERROR_SUCCESS

更新 原来这个错误是因为代码中包含的另一个头文件有一个函数“GetLastError”,另一个函数在一个单独的命名空间中,所以解决方案是调用 GetLastError,如下所示。

/*
 * the :: will tell it to use the GetLastError that is available on the global 
 * scope.  Most of Microsoft's calls don't have any namespace.
 */
DWORD dw = ::GetLastError();
4

1 回答 1

2

事实证明,这个错误是因为代码中包含的另一个标头有一个函数“GetLastError”,另一个函数位于单独的命名空间中,因此解决方案是调用 GetLastError,如下所示。

/*
 * the :: will tell it to use the GetLastError that is available on the global 
 * scope.  Most of Microsoft's calls don't have any namespace.
 */
DWORD dw = ::GetLastError();
于 2012-06-21T16:40:44.550 回答