为什么Windows字符路径长度为260个字符?

  • 回答 (9)
  • 关注 (0)
  • 查看 (446)

我遇到了几个问题:

  • 使用具有较长路径的开源Java项目
  • 在源码管理工具中存储深层的Fitnesse wiki树
  • 使用Bazaar导入我的源代码管理工具上面的树时出错

为何会有这个限制呢?

为什么至今没有解决这个问题?

如何处理路径限制?不是linux或mac系统

流浪的法师斗篷流浪的法师斗篷提问于
你想要的cccJava/Python/IOS爱好者,骑行+跑步。。。哦,对了,还养了两只猫。回答于
已采纳

最大路径长度限制在WindowsAPI中(除了以下段落中讨论的一些例外情况),路径的最大长度为MAX_PATH,定义为260个字符。本地路径按以下顺序构造:驱动器字母、冒号、反斜杠、由反斜杠分隔的Name组件以及终止空字符。例如,驱动器D上的最大路径是“D:\some 约256个字符长度“表示当前系统代码页的不可见终止空字符。(字符<>为了方便查看,不能成为有效路径字符串的一部分。)

现在我们看到它是1+2+256+1或 [drive][:\][path][null] = 260..可以假定256是固定字符串长度。回到DOS 的API中,跟踪每个驱动器当前的路径,并且我们有26(带符号的32)最大驱动器路径(以及当前目录)。

int0x21ah=0x47表示“此函数返回路径描述,而不使用驱动器号和初始反斜杠。”。因此,我们看到系统将CWD存储为一对(驱动器、路径),并通过指定驱动器(1=A,2=B,…)来请求路径,如果您指定一个0,那么它假设INT 0x21AH=0x15AL=0x19返回的驱动器的路径。现在我们知道了为什么是260而不是256,因为这4个字节没有存储在路径字符串中。

为什么有256字节的路径字符串,因为640 K是可用的RAM。

婷槟沃回答于

另一种处理方法是使用Cygwin,这取决于您想对文件进行什么操作(即,Cygwin命令是否适合您的需要)

例如,它允许复制、移动或重命名Windows Explorer不能的处理文件。当然,也可以处理它们的内容,如md5sum、grep、gzip等。

另外,对于正在编码的程序,您可以将它们链接到Cygwin DLL,并使它们能够使用长路径(未测试)。

圣安德烈未来已来,只是尚未流行回答于

至于如何处理Windows上的路径大小限制——可以使用7zip。我用它传输了IDE安装(Eclipse插件路径)生成的文件和一些文档。

不知道它是怎么规避Windows设置的260字符限制(从技术角度),但是,它是有效的!

从他们的源码可以发现

“NTFS实际上可以支持长达32000个字符的路径名。” 7-zip也支持这样名字。 但在SFX代码中是禁用的。因为有些用户不知道如何使用长路径。

发布说明:

9.32阿尔法版本2013年-12-01

  • 改进了对260字符以上的文件路径名的支持。 4.44 beta版本 2007-01-20
  • 7-Zip现在支持超过260字符的文件路径名。

重要说明:若要使其正常工作,需要在7zip“解压缩”对话框设置目录路径,而不是拖放文件到预定的文件夹。否则,“temp”文件夹将被用作临时缓存,否则会弹出该错误。

弹指之间好奇心很强的宅男回答于

我的解决方法是对路径中的目录使用“短名称”。例如C:\Program Files\我会用C:\PROGRA~1\或者可以使用dir /x...

驿徽IT攻城师回答于

还可以使用链接命令来缩短路径。

例如:

  1. 创建一个C:\p目录。
  2. mklink /J C:\p\foo C:\Some\Crazy\Long\Path\foo
  3. 直接用 C:\p\foo即可
郑治回答于

Windows 10中。你可以通过修改注册表项取消限制。

从Windows 10开始,1607版本, MAX_PATH 被限制了。但是你可以通过修改注册表启动长路径。修改注册表项HKLM\SYSTEM\CurrentControlSet\Control\FileSystem LongPathsEnabled(类型:REG_DWORD).在第一次调用受影响的Win 32文件或目录函数后,系统将缓存密钥的值(列表如下)。注册表项也可以通过组策略在Computer Configuration > Administrative Templates > System > Filesystem > Enable NTFS long paths.您还可以通过via文件来设置每个应用程序启动的长路径:<application xmlns="urn:schemas-microsoft-com:asm.v3"><windowsSettings xmlns:ws2="http://schemas.microsoft.com/SMI/2016/WindowsSettings"><WS2:LongPathAware>true</WS2:LongPathAware></windowsSettings></application>

如此逝水流年普通程序员老宋的日常读书学习笔记回答于

您可以将文件夹挂载为驱动器。在命令行中,如果您有一个路径C:\path\to\long\folder你可以把它映射成驱动字母X:使用命令:

subst x: \path\to\long\folder
风雨交加不会踢球的营销狗不是好厨子回答于

现代Windows可以增加MAX_PATH允许更长的路径。

通过API可知,Windows保证所有应用程序标准文件API不会返回超过260字符。

代码如下:

WIN32_FIND_DATA findData;

FindFileFirst("C:\Contoso\*", ref findData);

创建我的WIN32_FIND_DATA结构:

WIN32_FIND_DATA {
   DWORD    dwFileAttributes;
   FILETIME ftCreationTime;
   FILETIME ftLastAccessTime;
   FILETIME ftLastWriteTime;
   //...
   TCHAR    cFileName[MAX_PATH];
   //..
}

我的应用程序没有声明常量的值MAX_PATH,但是Windows API声明了。我的应用程序使用了这个定义的值。

我的结构是正确定义的,并且只分配592字节总数。这意味着我只能接收小于260字符。

如果Windows允许文件名超过260字符,则我的现有应用程序(使用了正确的API)将运行失败。

首先需要确保现有应用程序没有失败再来修改MAX_PATH。例如,我在Windows 3.11上运行的Windows应用程序。它仍然运行在64位Windows 10上。

微软确实创造了一种使用完整的32,768条路径名的方法;但是他们必须创建一个新的API来完成它。首先,您应该使用Shell API来枚举文件(不是所有文件都存在于硬盘或网络共享中)。

m9747785回答于

NTFS文件系统支持多达32k字符长的路径。路径前缀为大于260个字符时你可以使用Win 32 API和“\\?\“。

另一个问题是暴露长路径支持所导致的不一致行为。长路径\\?\前缀可以在大多数与文件相关的WindowsAPI中使用,但不是所有的WindowsAPI.都可以。例如,LoadLibrary将模块映射到调用进程的地址,如果文件名大于最大值,则意味着你需要将DLL移动到另一个位置,使其路径少于260个字符。

扫码关注云+社区

领取腾讯云代金券