窗口256个字符的path名称限制

经过长时间的研究,我终于发现,即使在最新的Microsoft Windows 7中,path名也不能超过256个字符。我真的不知道为什么有这样一个愚蠢的限制,因为NTFS可以处理高达32,000个字符的path长达十几年没有任何问题! 有没有可能改变呢? 或者有没有实际的解决scheme来避免这种情况?

即使是简单的使用情况,例如一些长文件名的嵌套照片目录,也只有260个字符。

据微软称:

  • 传统的Windows API将path名限制为260个字符,即使是为最新版本开发的应用程序。

  • 使用支持Unicode的API的应用程序可以使用允许最多32767个字符的pathforms。 文件名必须以\\?\为前缀,并且必须是绝对path,例如\\?\c:\dir\file\\?\UNC\server\share\file 。 有进一步的限制,请参阅参考的细节。

如果您已经设法创build并使用深层文件层次结构,并且需要使用因文件名长度而popup的应用程序,则可以尝试以下几件事:

  • 使用mklink命令创build符号链接 ,并将使用它们的path传递给您的应用程序。

  • 使用subst命令将一个驱动器号分配给一个目录。

  • 从一个深层的目录开始你的应用程序并传递它相对短的path。

  • 用8.3的别名( micros~1 )来replace一些长名字,假设这些名字仍然存在于Windows 7中。如果你的micros~1micros~2一起存在,我不知道如何判断哪一个是哪个; 也许运行DOS command.com (同样,假设Windows 7仍然可以)。

您可以使用短(8.3)名称为所有文件夹和文件。

您需要确保它们已启用。

一个长文件名被认为是超过了短MS-DOS(也称为8.3)风格命名约定的任何文件名。 通常,Windows将长文件名称存储在磁盘上作为特殊的目录条目, 由于性能的原因,系统可能会禁用该文件,具体取决于特定的文件系统。 当您创build一个长文件名时,Windows也可能会创build一个名为8.3别名的简短8.3格式,并将其存储在磁盘上。 对于指定的音量,可以禁用此8.3别名。

(我的大胆)

您还必须编写一些代码才能从长名称中获取短名称。

资源

NTFS中的文件/目录名称被限制为255个unicode码点,因为长度存储为一个字节。 但是总path长度没有固有的限制。

许多Win32 API调用(包括explorer shell)调用都具有260-1的长度限制。 其他一些调用有能力使用\\?\前缀来获得32K(less一点,因为卷名在Kernel-land中被替代)