我正在一个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”是如何创建的吗?理论是什么?
谢谢。
答案 0 :(得分:3)
我无法确切地告诉您为什么OS设计师决定将长度限制为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。
答案 1 :(得分:1)
您可以使用Unicode(-W)函数访问非常长的路径名。这需要更多的工作,但并不是那么困难。这是该主题的Microsoft article。有限制(例如,没有相对路径),但总体来说效果很好。
此外,MAX_PATH已在最新的Win 10更新中进行了扩展,但需要进行组策略编辑才能启用新长度。