1

我有一个测试,它在循环中创建一系列文件夹,直到它超过 MAX_PATH (260)。这将返回 ERROR_PATH_NOT_FOUND(0x3)。我们有一台运行此测试的构建机器,但在构建机器上它返回 ERROR_FILENAME_EXCED_RANGE (0xce)。

我的机器是 Windows 7,但构建机器是 Vista。这可能是他们返回不同值的原因吗?如果没有,有谁知道为什么会发生这种情况?

编辑:我期待得到一个错误,我正在测试一个文件系统驱动程序。我只是不明白为什么我从不同机器上的同一个测试中得到两个不同的错误代码。这是代码

homeDir << "C:\Users\me\TestFolder";

string childDir = "\\LongChildDirectoryName";
string dir = homeDir.str();
DWORD lastErr = ERROR_SUCCESS;
while(lastErr == ERROR_SUCCESS) 
{
    int len = dir.size();
    if(len > (MAX_PATH - 12))
    {
        CuFail(tc, "Filepath greater than max allowed should be");
    }

    dir += childDir;

    if(!CreateDirectory(dir.c_str(), NULL))
    {
        lastErr = GetLastError();
        if (lastErr == ERROR_ALREADY_EXISTS)
            lastErr = ERROR_SUCCESS;
    }
}
CuAssert(tc, "Check error is ERROR_PATH_NOT_FOUND", lastErr == ERROR_PATH_NOT_FOUND);
4

2 回答 2

1

逻辑有缺陷。如果 homeDir.str() 返回一个不存在的名称,则 CreateDirectory 的返回值将是 ERROR_PATH_NOT_FOUND。您可以通过简单地执行以下操作来演示问题:

string childDir("\\LongChildDirectoryName");
string dir("foo");

CreateDirectory 调用将获得路径 foo\LongChildDirectoryName,如果 foo 不存在,您将获得 ERROR_PATH_NOT_FOUND。修复只是在while循环之前添加这个:

CreateDirectory(dir.c_str(), NULL);

您还需要在连接字符串之后而不是之前移动长度检查。使用 Alex 建议的 "\\?\" 语法也是一个好主意。

于 2012-05-22T17:04:14.080 回答
0

要使用更长的路径,您需要使用 , 的“宽”CreateFile()版本CreateFileW()

请参阅有关该主题的MSDN 文章

HANDLE WINAPI CreateFile(
  __in      LPCTSTR lpFileName,
  __in      DWORD dwDesiredAccess,
  __in      DWORD dwShareMode,
  __in_opt  LPSECURITY_ATTRIBUTES lpSecurityAttributes,
  __in      DWORD dwCreationDisposition,
  __in      DWORD dwFlagsAndAttributes,
  __in_opt  HANDLE hTemplateFile
);

lpFileName [in]

    The name of the file or device to be created or opened.

    In the ANSI version of this function, the name is limited to MAX_PATH characters.
To extend this limit to 32,767 wide characters, call the Unicode version of the
function and prepend "\\?\" to the path. For more information, see Naming Files,
Paths, and Namespaces.
于 2012-05-22T02:22:55.583 回答