我正在做一个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"是如何创造的?理论是什么?
谢谢。
我不能确切地告诉你为什么操作系统设计师决定将长度限制在 260 个字符,除此之外,我确信内存分配考虑与此有关。但是我可以告诉你一个缩短路径名的技巧,以便每个目录只有八个字符(也称为 8.3 别名(。这将允许 27 个级别的路径名,这应该可以解决大部分(如果不是全部(问题。
如果您有此路径名:
C:my long directorymy other long directory namemy long directory againmy long file.txt
简短的版本是:
C:MYLONG~1MYOTHE~1MYLONG~2MYLONG~1.TXT
要以编程方式获取短路径名(从此处借用(:
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 directorymy other long directory namemy long directory againmy 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,MS-DOS仅允许文件名和/或目录名称最多八个字符,并具有可选的三字符扩展名。Windows希望在不破坏与DOS格式的兼容性的情况下支持更长的文件和路径名,因此他们提出了这种缩写长文件名的方法。
有关更多信息,请参阅命名文件、路径和命名空间。
您可以使用 Unicode(-W(函数访问很长的路径名。工作量要大一些,但也不是那么困难。这是一篇关于该主题Microsoft文章。有局限性(例如没有相对路径(,但总的来说它运行良好。
此外,MAX_PATH已在最新的 Win 10 更新中扩展,但它需要组策略编辑才能启用新长度。