标签: max-path

如何在Windows中查找路径长度超过260个字符的文件?

我在XP Windows脚本中使用xcopy来递归复制目录.我不断收到"Insufficient Memory"错误,我理解这是因为我试图复制的文件路径太长了.我可以轻松地减少路径长度,但不幸的是我无法确定哪些文件违反了路径长度限制.复制的文件将打印到标准输出(我将其重定向到日志文件),但错误消息将打印到终端,因此我甚至无法计算出哪个目录正在给出错误.

windows windows-xp xcopy max-path

80
推荐指数
4
解决办法
17万
查看次数

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

刚做了一个有趣的案例.

我的软件报告了由于路径长于MAX_PATH而导致的故障.

该路径只是我的文档中的一个普通旧文档,例如:

C:\Documents and Settings\Bill\Some Stupid FOlder Name\A really ridiculously long file thats really very very very..........very long.pdf
Run Code Online (Sandbox Code Playgroud)

总长度为269个字符(MAX_PATH == 260).

用户没有使用外部硬盘或类似的东西.这是Windows托管驱动器上的文件.

所以我的问题是这个.我应该关心吗?

我不是说可以我对付长的路径,我问应该 I.是的,我知道一些的Win32 API的"\?\"的Unicode劈,但似乎这个技巧是不是没有风险(如它正在改变API解析路径的行为方式),并且所有API都不支持.

所以,无论如何,让我只说出我的立场/断言:

  1. 首先可能是用户能够打破此限制的唯一方法是,如果她使用的应用程序使用特殊的Unicode黑客攻击.这是一个PDF文件,所以她使用的PDF工具可能使用这个hack.
  2. 我尝试重现这个(通过使用unicode hack)并进行实验.我发现虽然文件出现在资源管理器中,但我无能为力.我无法打开它,我无法选择"属性"(Windows 7).其他常见的应用程序无法打开文件(例如IE,Firefox,记事本).资源管理器也不会让我创建太长的文件/目录 - 它只是拒绝.同上命令行工具cmd.exe.

基本上,人们可以这样看待它:一个胭脂工具允许用户创建一个许多Windows无法访问的文件(例如Explorer).我可以认为我不应该处理这个问题.

(顺便说一下,这不是对最短路径长度的批准投票:我认为260个字符是一个笑话,我只是说如果Windows shell和一些API无法处理> 260那么我为什么要这样做?).

那么,这是一个公平的观点吗?我应该说"不是我的问题"吗?

更新:刚刚让另一个用户遇到同样的问题.这次是一个mp3文件.我错过了什么吗?这些用户如何创建违反MAX_PATH规则的文件?

winapi max-path

30
推荐指数
4
解决办法
2万
查看次数

在Windows上,何时应该使用"\\\\?\\"文件名前缀?

给定一个Unicode文件名,我遇到了用于打开文件的ac库.在打开文件之前,它首先通过前缀"\\?\"将文件名转换为路径.根据这篇msdn文章,除了增加路径中允许的最大字符数之外,还有什么理由可以做到这一点吗?

看起来这些"\\?\"路径需要Windows API和标准库的Unicode版本.

c++ unicode winapi filenames max-path

13
推荐指数
2
解决办法
7877
查看次数

Boost.Filesystem中的MAX_PATH限制

我想使用Boost.Filesystem库来操作路径,文件和目录.我的问题是支持的路径长于MAX_PATH吗?

我知道在Win32API中我们有解决方法"\\?\"但是PathAppend和PathCombine等基本功能不支持它.

所以我正在寻找有关MAX_PATH和Boost.FS的任何有用信息.

谢谢

UPD:我关心路径追加,路径组合等所有操作(我在Win32API中有这些功能,但它们不适用于长于MAX_PATH的路径)例如,CreateFileW和DeleteFileW都支持比MAX_PATH更长的路径.May Boost.FS可以替代Win32API实用程序函数,例如shlwapi和shell32中的函数,它们通常不支持长路径

c++ winapi boost max-path

11
推荐指数
1
解决办法
2848
查看次数

ASP.NET url MAX_PATH限制

我发现ASP.NET的一个问题,我知道至少已经让另外一个人难过了.我们试图使用HttpModule来处理Web应用程序的通配符请求.生成的url是动态的,可能长达数百个字符.不幸的是,aspnet_isapi.dll文件中似乎存在一个限制,它将url中路径的长度限制为MAX_PATH,其中硬编码为260个字符.

有没有其他人遇到这个并找到了解决这个限制的方法?查询字符串参数不是一个选项.

谢谢,格雷格巴拉德

asp.net url isapi max-path

10
推荐指数
3
解决办法
9010
查看次数

Inno Setup编译器"无法找到指定的路径"错误与长路径

我正在使用.iss脚本在Inno Setup Compiler中构建一个exe文件.我需要将一些node_modules打包到这个应用程序中,所以我有一行看起来像这样:[Files]

Source: "{#SourcePath}Encore.Warehouse.UI\bin\Warehouse_Release\warehouse\*"; \
    DestDir: "{app}\warehouse"; Flags: ignoreversion recursesubdirs createallsubdirs
Run Code Online (Sandbox Code Playgroud)

编译时,我收到此错误:

该系统找不到指定的路径.

这是编译器输出:

编译器输出

所以,它似乎运行正常,直到它中止.我最初的想法是,browser.js它不存在,但经过双重检查,情况并非如此.此外,我在源路径中使用通配符,因此编译器知道该文件存在,但似乎在压缩它时遇到问题.

另一个可能导致问题的是文件路径长度.由于嵌套依赖性,节点模块通常最终会出现荒谬的文件路径长度.在这种情况下,路径长度为260.假设这是造成问题的原因,有什么方法可以绕过它吗?

inno-setup max-path filepath node-modules

10
推荐指数
1
解决办法
2089
查看次数

在C#/ .NET中访问MAX_PATH之外的文件

背景

我需要编写一个使用.NET 2.0版本的工具(由于政治,商业和机密性/信任原因,使用现成的东西不是这个客户的选项)通过网络将文件从一个服务器迁移到另一个服务器.服务器是本地团队的文件服务器,某些团队文件夹需要迁移到其他服务器以便于重组.基本的想法是我们读取每个文件并在数小时内通过网络流式传输,几天后数据将被迁移.需要保留文件权限.由于这将花费几天时间(我们正在谈论几千兆字节的数据,对于某些团队而言),我们需要每晚迭代文件并比较修改日期并更新已更改的日期.理论上说,最终新服务器将拥有最新的文件副本,用户可以切换到新服务器.它当然不是那么简单,但我们有一个我们认为应该工作的设计:)

问题

所以理论上我们只需打开文件,通过网络流式传输,然后在另一端写入,对吧?:)

不幸的是,在服务器本身,文件共享是在文件夹路径创建的,例如:

D:\ Data\Team Shares\DIVISION\DEPARTMENT\NAME OF TEAM - 可能会长期一直

对于每个用户,此路径将映射到驱动器,例如,它将作为\\ SERVER\TEAMNAME共享并映射到T:驱动器.

这导致了从T:驱动器可见的文件在MAX_PATH限制范围内的情况,但是当在服务器本身上本地查看时,它们会超出它.我们无法使用网络共享来访问文件,因为这个工具需要是通用的,要在数百个这样的服务器上运行,并且没有标准的方法来判断哪些文件共享是我们应该移动的文件共享和那些不是 - 甚至没有命名约定标准.此外,偶尔会有其他股份的子股票,因此我们超过MAX_PATH限额两倍!

我知道使用"\\?\"前缀指定路径的解决方法,该路径将路径视为UNC路径,并允许理论上最多32k个字符.

这种解决方法是在Win32 API级别实现的,System.IO命名空间(大部分)基本上只是本机Win32 API函数的一个薄包装,但是在将调用交给API之前,Microsoft已经"帮助"实现了额外(不正确)的验证. .在这种情况下,.NET Framework拒绝该路径,因为它声称'?' 是一个无效的路径字符.

所以我的问题是......有没有一种方法我没有想到这将允许我解决这个问题,而不必完全重写几乎整个System.IO命名空间,加载P/Invoke调用,只是为了删除这个烦人的验证?

c# pinvoke winapi fileshare max-path

9
推荐指数
1
解决办法
3703
查看次数

C++ WinAPI:处理长文件路径/名称

我正在寻找在Windows应用程序中处理更长的文件路径.

目前,我有一个文本框(编辑框),用户可以在其中键入绝对文件路径.然后,我将这个类型化的文件路径读GetWindowText入一个声明如下的字符串:TCHAR FilePath[MAX_PATH];

显然,在这里,我依靠的是MAX_PATH常数,这限制了我的260个字符.因此,为了处理更长的文件/路径名称,我可以像这样扩展我的TCHAR数组:TCHAR FilePath[32767];.

或者,还有更好的方法?我可以使用可变长度数组吗?(TCHAR FilePath[];这在C++中是否可能? - 对不起,我对此很新).

先谢谢你!


这是我上面提到的整个代码片段:

TCHAR FilePath[MAX_PATH];
ZeroMemory(&FilePath, sizeof(FilePath));
GetWindowText(hWndFilePath, FilePath, MAX_PATH);
Run Code Online (Sandbox Code Playgroud)

c++ winapi max-path long-filenames

8
推荐指数
2
解决办法
5464
查看次数

WinRT中的MAX_PATH

我知道WinRT中的文件系统访问是不同的(读取:隔离),但我很好奇我们是否还要担心MAX_PATH,还是避免了这种限制?

max-path windows-runtime

5
推荐指数
1
解决办法
863
查看次数

如何创建超过MAX_PATH的目录

出于测试目的,我想在磁盘上创建一个超过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();
    }
Run Code Online (Sandbox Code Playgroud)

c# windows max-path

5
推荐指数
1
解决办法
1732
查看次数