【问题标题】:How to create a directory recursively in C++ that exceeds MAX_PATH?如何在 C++ 中递归创建超过 MAX_PATH 的目录?
【发布时间】:2014-01-03 20:47:13
【问题描述】:

我一直在尝试递归地创建一个文件夹,这意味着当我输入时

"C:\\test\\aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabaaabaababbaabababaabbababababaabababbabab\\22222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222\\12345");

它将创建直到最后一个条目之前不存在的每个文件夹。我试过 SHCreateDirectoryExW,但它不接受长于 MAX_PATH 的路径,甚至不接受特殊前缀。是否有一个已经存在的功能可以使用多达 32k 个字符来执行此操作,还是我必须自己创建一个?我可以创建一个普通的文件夹,只要上面的文件夹存在,就好了。

【问题讨论】:

  • 只是出于好奇,你为什么需要这样做?
  • 这可能需要安装一个可以欺骗常见安全程序的恶意软件:p

标签: c++ windows winapi directory


【解决方案1】:

最后我屈服于 Boost,主要是因为我只需要添加 1 行。

std::tstring widePath = WIDEPATH_PREFIX;
widePath += CStringW(filePath.c_str());
return (boost::filesystem::create_directories(widePath));

我只是将前缀附加到我的文件路径并将其发送到 boost。

【讨论】:

    【解决方案2】:

    您需要分别在路径上创建每个目录。将路径解析为其目录组件,然后一一处理。当你遇到一个不存在的目录时,创建它,然后向下移动到下一层。

    这里需要用到的API函数是CreateDirectory。将完整路径传递给您需要创建的目录。您需要使用 Unicode 版本的 API,并带有 \\?\ 前缀来禁用 MAX_PATH 长度限制。

    【讨论】:

    • 您需要兼容 unicode,因此请使用CreateDirectoryW。使用CreateDirectoryA 不支持长路径。
    • @Benoit 答案已经说过了。 您需要使用 Unicode 版本的 API,并带有 \\?\ 前缀来禁用 MAX_PATH 长度限制。
    • 虽然技术上可行,但 这样做并不是一个好主意,因为例如Windows 资源管理器和大多数其他程序以及一些 API(例如 shell 实用程序函数)受到限制MAX_PATH。普通的最终用户可能会发现很难删除或检查这样的目录。
    • @Cheersandhth.-Alf 你的意思是肯定把这个评论附加到这个问题上
    • @DavidHeffernan 我打算将它附加到这个答案中。 IMO 属于答案的信息,供一般答案读者查看,例如通过谷歌进来。但是,我尽量不编辑其他人的答案。 ;-)
    【解决方案3】:

    将路径拆分为其组件。检查这些组件中的每一个是否存在,或者一个一个地创建,同时将应用程序当前目录设置为该目录。这样您就不必处理完整的路径,一次只处理一个(相对)组件。

    类似这样的伪代码:

    split_path();
    set_cwd(root);
    for (i = 0; i < number_of_components; ++i)
    {
        if (!does_path_exits(component[i]))
            makedir(component[i]);
        set_cwd(component);
    }
    

    【讨论】:

    • 修改工作目录是不好的做法。这会影响整个过程,因此此代码可能会影响其他线程。这只是一个讨厌的大全局变量。 CreateDirectoryW 和 `\\?` 是这里需要的机制。
    • @Liviu 在我看来这不能成为借口。如果您想要在多个平台上工作的东西,请将其包装在具有特定于平台实现的辅助函数中。
    • @David Heffernan 不久前“我们”在 Mac OS X 上需要这个,BSD API 有同样的限制(或者几乎...... PATH_MAX 是名称),但没有 `\\?` 机制所以这是唯一的解决方案。
    猜你喜欢
    • 2013-07-18
    • 1970-01-01
    • 2011-09-08
    • 2011-04-10
    • 2011-10-10
    • 2012-03-21
    • 2017-08-13
    • 1970-01-01
    相关资源
    最近更新 更多