【问题标题】:File path is longer that 255 characters, how this "255" explained?文件路径长了255个字符,这个“255”怎么解释?
【发布时间】:2019-01-16 12:12:55
【问题描述】:

我正在开发一个 Visual Basic 项目,我们在其中开发了一个 Word 选项卡。 我遇到了一个问题,当用户使用路径超过 255 个字符的 word 文档时,会出现以下错误。

Unexpected error 9105 : String is longer than 255 characters.

我在网上搜索了“255”是如何创建的,发现

在 Windows 中有一个限制,最大绝对文件路径长度为 文件/文件夹是 MAX_PATH(定义为 260)。

也发现了,

Microsoft Office 文档的完整路径包括驱动器号或服务器名称,以及直到并包括文档名称的所有字符和文件夹名称。整个路径在 Word 中不能超过 242 个字符,在 Excel 中不能超过 218 个。

另外我在做这个问题的测试时发现,当文件路径长度为 254 时,我们也有同样的错误,这是因为不可见的 NUL 终止符。

255 = 254 + 1(NUL 终止符)

谁能解释一下这个“255”是如何创建的?理论是什么?

谢谢。

【问题讨论】:

  • 我投票结束这个问题,因为这个问题是关于微软做出的设计决定,似乎与开发无关。
  • 您是想解决问题,还是只是出于好奇? (好奇并没有错 - 但如果您有特定问题并且可以提供详细信息,您可能会得到更好的回应)
  • @DaveInCaz 我正在解决一个问题,我认为我需要对“255”数字有一个正确的理解。我可以向用户解释“260”或“242”,但无法解释 255。在此问题中,我已指示在用户继续处理路径长度超过的文档/图像/视频/音频时向用户发出警告255,所以使用“GetLongPathNameA”(我遇到过一些长路径被系统缩短的情况,但是在继续我们的应用程序时会出错,所以提取长路径名以给出警告。),我做了我的实施。

标签: windows ms-word vb6 ms-office


【解决方案1】:

我不能准确地告诉你为什么操作系统设计者决定将长度限制为 260 个字符,除此之外我确信内存分配考虑与它有关。但是我可以告诉你一个缩短路径名的技巧,这样每个目录就只有八个字符(也称为 8.3 别名)。这将允许深度为 27 层的路径名称,这应该可以解决大部分(如果不是全部)问题。

如果你有这个路径名:

C:\my long directory\my other long directory name\my long directory again\my long file.txt

简短的版本是:

C:\MYLONG~1\MYOTHE~1\MYLONG~2\MYLONG~1.TXT

以编程方式获取短路径名(借用自here):

Private Declare Function GetShortPathName Lib "kernel32" Alias "GetShortPathNameA" (ByVal longPath As String, ByVal shortPath As String, ByVal shortBufferSize As Long) As Long

'The path you want to convert to its short representation path.
Dim longPathName As String

longPathName = "C:\my long directory\my other long directory name\my long directory again\my long file.txt"

'Get the size of the string to pass to the string buffer.
Dim longPathLength As Long

longPathLength = Len(longPathName)

'A string with a buffer to receive the short path from the api call…
Dim shortPathName As String

shortPathName = Space$(longPathLength)

'Will hold the return value of the api call which should be the length.
Dim returnValue As Long

'Now call the function to do the conversion…
returnValue = GetShortPathName(longPathName, shortPathName, longPathLength)

MsgBox(shortPathName)

您可以在使用通常路径名的任何上下文中使用短路径名。

由于您对事物的原因感兴趣,Windows 最初取代了 MS-DOS,后者仅允许文件名和/或目录名最多八个字符,并带有可选的三个字符扩展名。 Windows 想在不破坏与 DOS 格式兼容性的情况下支持更长的文件名和路径名,所以他们想出了这种缩写长文件名的方法。

如需了解更多信息,请参阅Naming Files, Paths and Namespaces

【讨论】:

  • 尽管这不是我问题的答案,但这个回复真的很有帮助。我有一种情况,我的一些长文件路径被自动转换为 8.3 别名(短路径),我想知道如何在我的代码中识别它们,并参考你的回复和其他文章,我能够得到长路径从短途。非常感谢。
  • @ApsSanj - 您应该知道系统可能会禁用对 8.3 名称的访问。它实际上在服务器上相当普遍。如果你是为自己写,没问题。但是,如果您所写的内容可能会公开发布,那么依赖 8.3 名称可能会成为问题
  • 在完整路径前加上 ` \\?\ ` 。这告诉 Windows 文件函数,您知道路径最多为 32K(而不是 DOS\Windows 标准的 260 字节),并且您为它分配了足够的内存。这也适用于命令提示符。缺点是遵循 Windows 规则的程序将无法访问它,因为它们没有分配足够的内存来保存大于 260 字节的字符串。 `\\?\`的实际含义是关闭所有windows文件名检查
  • 请参阅stackoverflow.com/questions/41030190/command-to-run-a-bat-file/… 了解合法 Windows 文件名的规则。
  • @JimMack 我忘了提这个!!估计要迟到了。很高兴你抓住了它。
【解决方案2】:

您可以使用 Unicode(-W)函数访问很长的路径名。这是一个多一点的工作,但并不是那么困难。这是关于该主题的Microsoft article。有一些限制(例如,没有相对路径),但总体来说效果很好。

此外,MAX_PATH 已在最新的 Win 10 更新中进行了扩展,但需要编辑组策略才能启用新长度。

【讨论】:

    猜你喜欢
    • 2012-06-01
    • 2013-07-15
    • 1970-01-01
    • 2013-05-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-01-21
    • 2013-01-08
    相关资源
    最近更新 更多