【发布时间】:2020-05-06 04:59:45
【问题描述】:
在 Windows 10 Home 和 Python 3.6.6 上,我通过 setting it in the registry 和 prefixing \\?\ 启用了长路径。我还关注了this answer 并确保路径使用\\ 而不是/,在unicode u' 中并且是绝对路径。我的文件名中没有非法字符。我的文件路径也比maximum total path length of 32,767 characters 小很多。
尽管执行了上述所有操作,但当我尝试创建长文件名时,我仍然得到OSError: [Errno 22] Invalid argument。我尝试了 3 种不同的方法来创建文件路径,如下面的output_filepath,但都不起作用:
# Long filename - Does not work
import os, pathlib
output_filepath = u'\\\\?\\' + os.path.join(os.path.dirname(os.path.realpath(__file__)), u"somereallylongname" * 30 + u".result")
# output_filepath = u'\\\\?\\C:\\Users\\Jarrett\\Downloads\\somereallylongnamesomereallylongnamesomereallylongnamesomereallylongnamesomereallylongnamesomereallylongnamesomereallylongnamesomereallylongnamesomereallylongnamesomereallylongnamesomereallylongnamesomereallylongnamesomereallylongnamesomereallylongnamesomereallylongnamesomereallylongnamesomereallylongnamesomereallylongnamesomereallylongnamesomereallylongnamesomereallylongnamesomereallylongnamesomereallylongnamesomereallylongnamesomereallylongnamesomereallylongnamesomereallylongnamesomereallylongnamesomereallylongnamesomereallylongname\\x.x'
# output_filepath = r'\\?\C:\Users\Jarrett\Downloads\somereallylongnamesomereallylongnamesomereallylongnamesomereallylongnamesomereallylongnamesomereallylongnamesomereallylongnamesomereallylongnamesomereallylongnamesomereallylongnamesomereallylongnamesomereallylongnamesomereallylongnamesomereallylongnamesomereallylongnamesomereallylongnamesomereallylongnamesomereallylongnamesomereallylongnamesomereallylongnamesomereallylongnamesomereallylongnamesomereallylongnamesomereallylongnamesomereallylongnamesomereallylongnamesomereallylongnamesomereallylongnamesomereallylongnamesomereallylongname\x.x'
print("filepath length = %s" % len(output_filepath))
print("filename length = %s" % len(os.path.basename(output_filepath)))
if not os.path.exists(os.path.dirname(output_filepath)): os.makedirs(os.path.dirname(output_filepath))
pathlib.Path(output_filepath).touch() # or open(output_filepath, 'a').close()
print("Wrote to " + output_filepath)
【问题讨论】:
-
Python 3 中的字符串是 unicode;无需使用 Python 2 中的
u前缀。此外,如果您使用的是 Python 3.6+ 和 Windows 10,并且您已在注册表中启用长路径,则无需使用扩展路径 (即非规范化设备路径)在“\\?\”设备根路径中。您可以使用常规 DOS 路径。正如 Drake 所讨论的,问题在于文件系统的最大组件长度是根据其内部数据结构固定的,绝对没有什么可以改变这一点。 -
Windows API 本身具有类似的组件长度限制,该限制被嵌入到来自
FindFirstFileW/FindNextFileW的目录列表的结果中,由 Python 的os.listdir和os.scandir在内部调用。 API 将目录列表中的名称限制为MAX_PATH(260) 个字符。请注意,在这种情况下,他们重用了MAX_PATH常量,尽管目录列表中的名称不是路径。
标签: python python-3.x windows winapi python-3.6