创建超过文件路径限制的文件

时间:2012-05-21 16:40:06

标签: windows file winapi

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

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

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

homeDir<< “C:\用户\我\ 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);

2 个答案:

答案 0 :(得分: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提出的“\\?\”语法也是一个好主意。

答案 1 :(得分:-1)

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

有关主题的信息,请参阅此MSDN article

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.