如何创建超过 MAX_PATH 的目录

Posted

技术标签:

【中文标题】如何创建超过 MAX_PATH 的目录【英文标题】:How to create directory exceeding MAX_PATH 【发布时间】:2013-07-18 19:53:18 【问题描述】:

出于测试目的,我想在磁盘上创建一个超过 Windows MAX_PATH 限制的目录。 我该怎么做?

(我尝试过 Powershell、cmd、windows explorer => 被阻止了。)

已编辑: 使用 ZetaLongPaths 库中的 ZlpIOHelper 可以做到这一点,而标准 Directory 类会抛出可怕的异常:

        static void Main(string[] args)
    
        var path = @"d:\temp\";
        var dirName = "LooooooooooooooooooooooooooooooooooooooooooooongSubDirectory";
        while (path.Length <= 280)
        
            path = Path.Combine(path, dirName);
            ZlpIOHelper.CreateDirectory(path); //Directory.CreateDirectory(path);
        
        Console.WriteLine(path);
        Console.ReadLine();
    

【问题讨论】:

在 C# 中试试这个库:zetalongpaths.codeplex.com/....or 如果它在 WIN32 中,那么你需要使用特殊前缀来允许更长的文件名。见:msdn.microsoft.com/en-us/library/aa365247.aspx 在一些 API 方法中有一条注释,您可以使用带有 Unicode 调用的“\\?\”作为长路径的前缀,但我不知道这是否会转化为命令-线工具 【参考方案1】:

在 WIN32 中,您需要使用特殊的“\\?\”前缀来允许更长的文件名。

见:http://msdn.microsoft.com/en-us/library/aa365247.aspx

对于文件 I/O,路径字符串的“\\?\”前缀告诉 Windows 用于禁用所有字符串解析并发送后面的字符串的 API 它直接到文件系统。例如,如果文件系统 支持大路径和文件名,可以超过 MAX_PATH Windows API 强制执行的限制。更多 有关正常最大路径限制的信息,请参阅前面的 部分最大路径长度限制。

当您使用 C# 时,请尝试使用此库,这将使您不必对 WIN32 文件 API 执行所有 PInvokes 并将前缀添加到路径。

http://zetalongpaths.codeplex.com/

【讨论】:

【参考方案2】:

最简单的解决方法是创建一个目录c:\A\averylongnamethatgoesonandonandon..., 然后将C:\A 重命名为更长的名称。 Windows 不会检查 A 的每个子项以查看该子项的名称是否会超过 MAX_PATH

【讨论】:

您不会将现有目录重命名为短名称,然后创建一个长子目录,然后将其重命名。不,不是一个好的解决方案。此外,如果 A 的文件正在使用中,则不能这样做。【参考方案3】:

这样的事情怎么样:

var path = "C:\\";
while (path.Length <= 260)

    path = Path.Combine(path, "Another Sub Directory");

【讨论】:

该死,你打败了我+1 我以为他的意思是“在磁盘上创建”? 只需从我的评论中添加创建目录就可以了 @Rup:是的。我编辑了问题@Sayse:你得到了 PathTooLongException @sthiers - 但我很确定您会在此之前创建目录

以上是关于如何创建超过 MAX_PATH 的目录的主要内容,如果未能解决你的问题,请参考以下文章

Boost.Filesystem 中的 MAX_PATH 限制

我应该处理超过 MAX_PATH 的文件吗?

获取系统信息(WINDOWS目录/系统目录/临时目录/我的文档/桌面)

学习API之目录操作一 获取设置进程或模板路径

MFC: 获取可执行文件目录 + 写日志函数

MFC获取可执行文件(exe)所在文件目录