问题标签 [max-path]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票
2 回答
5250 浏览

winapi - 如何让 CreateProcess/CreateProcessW 在路径中执行进程 > MAX_PATH 字符

我试图让 CreateProcess 或 CreateProcessW 执行名称 < MAX_PATH 字符但路径大于 MAX_PATH 字符的进程。根据以下文档:http://msdn.microsoft.com/en-us/library/ms682425.aspx,我需要确保 lpApplicationName 不为 NULL,然后 lpCommandLine 最多可以包含 32,768 个字符。

我试过了,但我得到了 ERROR_PATH_NOT_FOUND。

我更改为 CreateProcessW,但仍然出现相同的错误。当我在 lpApplicationName 前面加上 \\?\ 时,如中所述http://msdn.microsoft.com/en-us/library/aa365247(VS.85).aspx在调用 CreateProcessW 时我得到一个不同的错误,让我觉得我更接近一点:ERROR_SXS_CANT_GEN_ACTCTX。

我对 CreateProcessW 的调用是:

CreateProcessW(w_argv0,arg_string,NULL,NULL,0,NULL,NULL,&si,&ipi);

w_argv0 在哪里\\?\<long absolute path>\foo.exe.

arg_string 包含 "<long absolute path>\foo.exe" foo

si 设置如下:

并且 pi 为空,如下所示:

我查看了系统事件日志,每次尝试使用事件 id 59 进行此操作时都会出现一个新条目,源 SideBySide: Generate Activation Context failed for .Manifest。参考错误信息:操作成功完成。

我尝试执行的文件在 < MAX_PATH 字符的路径中运行良好。

澄清一下, <long absolute path> 的任何一个组成部分都不大于 MAX_PATH 个字符。可执行文件本身的名称当然不是,即使最后有 .manifest。但是,整个路径加起来的长度大于 MAX_PATH 个字符。

无论我是否嵌入其清单,我都会收到相同的错误。清单被命名为 foo.exe.manifest,当它没有嵌入时,它与可执行文件位于同一目录中。它包含:

有谁知道如何让它工作?可能:

  • 调用 CreateProcess 或 CreateProcessW 以在路径 > MAX_PATH 字符中执行进程的其他方式

  • 我可以在清单文件中做的事情

我在 XP SP2 上使用 Visual Studio 2005 构建并运行本机。

谢谢你的帮助。

0 投票
7 回答
10240 浏览

asp.net - ASP.NET url MAX_PATH 限制

我发现了 ASP.NET 的一个问题,我知道这至少让其他人感到困惑。我们试图使用 HttpModule 来处理对 Web 应用程序的通配符请求。生成的 url 是动态的,可能有几百个字符长。不幸的是,aspnet_isapi.dll 文件中似乎存在一个限制,它将 url 中的路径长度限制为 MAX_PATH,它被硬编码为 260 个字符。

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

谢谢,格雷格巴拉德

0 投票
5 回答
8703 浏览

c++ - 在 Windows 上,什么时候应该使用“\\\\?\\”文件名前缀?

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

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

0 投票
5 回答
3839 浏览

c# - 在 C#/.NET 中访问超出 MAX_PATH 的文件

背景

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

问题

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

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

D:\Data\Team Shares\DIVISION\DEPARTMENT\团队名称 - 可能相当长\

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

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

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

此解决方法是在 Win32 API 级别实现的,System.IO 命名空间(大部分)基本上只是原生 Win32 API 函数的薄包装,但是微软在将调用交给 API 之前“有用地”实现了额外的(不正确的)验证. 在这种情况下,.NET Framework 拒绝该路径,因为它声称“?” 是无效的路径字符。

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

0 投票
1 回答
365 浏览

asp.net - 在我的 URL 中包含动态 URL 而不使用查询字符串?

ASP.NET 3.5、IIS7

在我的 Global.asax 的 Application_BeginRequest 中,我需要从请求的 URL 中提取一个完全独立的 URL,该 URL 已嵌入其中而不使用 query string

我想出的解决方案是对整个目标 URL 进行十六进制编码,就好像它是一个目录一样,如下所示:

http://localhost/687474703A...etc...732E6D7033/irrelevantFilename.txt

这对 IIS7 来说是失败的,它的ASP.NET 实现不会容忍 URL 路径大于 260 个字符

我的代码控制如何生成请求 URL,以及如何将目标 URL 嵌入其中,但它无法控制该目标 URL 值(它们是第三方 URL)。

在我的请求 URL 中嵌入这个目标 URL 的效果如何?

0 投票
8 回答
18319 浏览

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

刚遇到一个有趣的案例。

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

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

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

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

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

我不是说我可以处理长路径,我问我是否应该。是的,我知道某些 Win32 API 上的“\?\”unicode hack,但似乎这种 hack 并非没有风险(如它正在改变 API 解析路径的方式),并且并非所有 API 都支持。

所以无论如何,让我陈述我的立场/主张:

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

所以基本上,人们可以这样看:rouge 工具允许用户创建许多 Windows(例如资源管理器)无法访问的文件。我可以认为我不应该处理这个问题。

(顺便说一句,这不是对短最大路径长度的投票:我认为 260 个字符是个笑话,我只是说如果 Windows shell 和某些 API 不能处理 > 260 那么我为什么要?)。

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

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

0 投票
3 回答
7900 浏览

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

我正在考虑在我的 Windows 应用程序中处理更长的文件路径。

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

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

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

提前谢谢你!


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

0 投票
2 回答
3464 浏览

c++ - Boost.Filesystem 中的 MAX_PATH 限制

我想使用 Boost.Filesystem 库来操作路径、文件和目录。我的问题是是否支持比 MAX_PATH 更长的路径?

我知道在 Win32API 中我们有解决方法 "\\?\" 但它不受 PathAppend 和 PathCombine 等基本函数的支持。

因此,我正在寻找有关 MAX_PATH 和 Boost.FS 的任何有用信息。

谢谢

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

0 投票
3 回答
12081 浏览

c# - C#:有什么办法可以绕过完全限定路径的 260 个字符限制?

可能重复:
为什么 Windows 中存在 260 个字符的路径长度限制?

我试图找出一种方法来绕过这个可怕的 260 个字符的完全限定路径限制,同时我想知道为什么一开始就有路径限制!?我知道对某些人来说 260 似乎是“很多”,但自从我遇到这个问题以来,它确实不是。

基本上:
为什么必须有字符限制?
如何绕过它?

0 投票
1 回答
886 浏览

windows-runtime - WinRT 中的 MAX_PATH

我知道 WinRT 中的文件系统访问是不同的(阅读:隔离),但我很好奇我们是否仍然需要担心 MAX_PATH,或者是否避免了该限制?