为什么Windows报告此文件夹太长,无法复制?

如果您使用Windows的时间足够长,特别是使用名称较长的文件夹和文件时,您会遇到一个奇怪的错误:Windows会报告文件夹路径或文件名太长,无法移动到新的目标位置,甚至无法删除。怎么回事?

您遇到的问题是两个系统不幸的交集,在这种情况下会产生错误。为了准确了解错误的来源,在我们深入研究解决方案之前,我们需要深入研究长文件名(LFN)的历史以及Windows是如何与它们交互的。

在Windows95中,通过底层MS-DOS体系结构引入了长文件名。新的LFN系统允许最多255个字符的文件名和目录名。这是对以前的文件名系统(通常称为8.3文件名)的一个受欢迎的扩展,因为名称被限制为八个字符和三位数的扩展名,但也称为短文件名(SFN)。正如你可以想象的那样,当时仍然有很多基于DOS的应用程序,而且有很多令人头疼的问题,试图让新的LFN和传统的SFN很好地相互配合。如果您曾经遇到过带有奇怪截断文件的旧软盘或CD-ROM(如abCDEF~1.txt),则该文件名被某些使用SFN的遗留应用程序(如abcdefghijk.txt)从较长且不受支持的LFN中删减。

然而,我们距离20世纪90年代中期还有很长的一段路要走,整个长文件名的问题(在很大程度上)已经牢牢解决了。如果你运行的是过去10年的Windows版本,你可能从来没有遇到过像我们在DOS/Windows 95天里遇到的那样的文件名长度冲突。也就是说,正如您在磁盘清理项目中发现的那样,我们仍然遇到了问题。但是为什么呢?如果Windows的长文件名系统支持每个组件最多255个字符的文件夹和文件名,您会遇到什么问题?我们不能责怪NTFS(绝大多数现代Windows计算机使用的文件系统),因为NTFS将支持总路径长度为32,767个字符的文件夹和文件名链。这远远超出了大多数用户曾经需要的典型目录结构。

它完全崩溃的地方是一个人为的限制Windows堆栈在LFN/NTFS系统之上:MAX_PATH变量。MAX_PATH变量指定Windows中的完整目录结构不能超过260个字符,包括驱动器号、冒号、反斜杠和末尾的NULL反斜杠。因此,您可能只有256个字符的实际MAX_PATH,例如C:\YOUR-256-CHARACTER-PATH\。

因此,当您清理计算机时发生的情况是,您有一个路径已经很长的目录(要么是因为文件夹名太长,要么是因为文件名太长,或者两者兼而有之),并且当您尝试将这些目录中的一个或多个移到具有长路径的另一个目录时,路径名的总长度超过了MAX_PATH变量施加的260个字符的限制。

现在,你可能在想“啊哈!我们只需更改MAX_PATH变量即可解决问题!“。唉,事情没那么简单。不仅MAX_PATH变量本质上是硬编码到Windows中的,而且即使您经历了更改它的巨大麻烦,您最终也会破坏太多,这是不值得的。太多的应用程序期望PATH变量是Windows长期以来指定的值。我们不能随便改变它而不制造巨大的混乱。

这会让你处于什么境地呢?嗯,最简单的解决方案是只编辑路径数据。例如,如果您有大量已保存的文章,其中用于从Web保存它们的应用程序/扩展名创建了一个目录,该目录是文章的完整标题+文章前导,然后文件名本身就是文章的完整标题+文章前导,那么使用一次保存就可以非常简单地命中或超过MAX_PATH。将那些巨大的文件夹和文章标题编辑到更合理的大小是解决问题的一种简单方法。

如果您有大量具有长路径的文件,并且不想全部编辑它们(或者如果您想要删除一大堆旧目录,而这些目录在受到MAX_PATH变量的限制时对于Windows来说太长而无法处理),那么可以使用命令行解决方法。尽管Windows受到MAX_PATH变量的限制,但Windows工程师意识到,在某些情况下,用户需要处理较长的路径名。因此,Windows API具有处理超长路径的函数。

为了利用该API并在笨重的文件夹/文件名上使用命令行工具,您只需在目录名后附加几个额外的字符。例如,如果您有一个想要删除的大型目录结构(但在尝试删除时由于路径长度而收到错误),则可以将命令从以下位置更改:

致:

关键是在文件路径开始之前添加\\?\部分;这会指示Windows忽略MAX_PATH变量施加的限制,并与您刚才提供的直接由底层文件系统提供/理解的路径进行交互(它显然可以支持更长的路径)。与往常一样,请在命令提示符下谨慎操作,以避免意外删除您打算保持原样的文件或目录。

如果我们对此问题的概述让您感到好奇,那么一定要深入研究Microsoft开发人员网络库中的这篇文章“命名文件、路径和名称空间”,以获取有关幕后操作的更多信息。

有紧迫的技术问题吗?给我们发一封电子邮件到Ask@howtoek.com,我们会尽最大努力回复。

相关文章