文件路径长了255个字符,这个“255”如何解释?

问题描述 投票:0回答:2

我正在开发一个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”是如何创建的吗?理论是什么?

谢谢。

windows ms-word vb6 ms-office
2个回答
3
投票

我无法准确地告诉你为什么操作系统设计者决定将长度限制在260个字符以外,我确信内存分配考虑因素与它有关。但我可以告诉你一个缩短路径名的技巧,这样每个目录只有8个字符(也称为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,它允许最多8个字符的文件名和/或目录名,并带有可选的三字符扩展名。 Windows希望支持更长的文件和路径名,而不会破坏与DOS格式的兼容性,因此他们想出了这种缩写长文件名的方法。

有关更多信息,请参阅Naming Files, Paths and Namespaces


1
投票

您可以使用Unicode(-W)函数访问非常长的路径名。这是一项更多的工作,但并不是那么困难。这是关于这个主题的Microsoft article。有一些限制(例如没有相对路径),但整体上它运作良好。

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

© www.soinside.com 2019 - 2024. All rights reserved.