首页 > 解决方案 > 无法在 Windows 10 和 Python 3 上创建长文件名

问题描述

在 Windows 10 Home 和 Python 3.6.6上,我通过在注册表中设置长路径并在. 我也遵循了这个答案,并确保路径使用而不是, 是 unicode并且是绝对路径。我的文件名中没有非法字符。我的文件路径也远小于最大总路径长度 32,767 个字符\\?\\\/u'

尽管做了上述所有操作,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)

标签: pythonpython-3.xwindowswinapipython-3.6

解决方案


文件名组件(文件名中反斜杠之间的部分)太长,组件长度的最大数量取决于函数lpMaximumComponentLength参数中返回的值GetVolumeInformation

例如,对于支持长名称的 FAT 文件系统,该函数存储值 255。

尝试缩短文件名组件的长度,例如:

import os, pathlib
output_filepath = u'\\\\?\\' + os.path.join(os.path.dirname(os.path.realpath(__file__)), u"somereallylongname" * 14 + u'\\' + u"somereallylongname" * 14 + u'\\' + u"somereallylongname" * 2 + u".result")
# output_filepath = u'\\\\?\\C:\\Users\\Jarrett\\Downloads\\somereallylongnamesomereallylongnamesomereallylongnamesomereallylongnamesomereallylongnamesomereallylongnamesomereallylongnamesomereallylongnamesomereallylongnamesomereallylongnamesomereallylongnamesomereallylongnamesomereallylongnamesomereallylongnamesomereallylongnamesomereallylongnamesomereallylongnamesomereallylongnamesomereallylongnamesomereallylongnamesomereallylongnamesomereallylongnamesomereallylongnamesomereallylongnamesomereallylongnamesomereallylongnamesomereallylongnamesomereallylongnamesomereallylongnamesomereallylongname\\x.x'
# output_filepath = r'\\?\C:\Users\Jarrett\Downloads\somereallylongnamesomereallylongnamesomereallylongnamesomereallylongnamesomereallylongnamesomereallylongnamesomereallylongnamesomereallylongnamesomereallylongnamesomereallylongnamesomereallylongnamesomereallylongnamesomereallylongnamesomereallylongnamesomereallylongnamesomereallylongnamesomereallylongnamesomereallylongnamesomereallylongnamesomereallylongnamesomereallylongnamesomereallylongnamesomereallylongnamesomereallylongnamesomereallylongnamesomereallylongnamesomereallylongnamesomereallylongnamesomereallylongnamesomereallylongname\x.x'
print(output_filepath)
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)

推荐阅读