python - 无法在 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)
解决方案
文件名组件(文件名中反斜杠之间的部分)太长,组件长度的最大数量取决于函数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)
推荐阅读
- uno-platform - 如何让 UnoSliderDemo.Wasm 在 MacOS 上运行?
- sql - 如何在 oracle 11g 中格式化选择查询的列长度?
- ckeditor5 - 自定义构建后 API 不可用
- ios - RxSwift 等待 observable 完成,然后返回 observable
- lua - (Lua/IUP) 在执行下一个函数之前检查一个函数是否完成
- asp.net-mvc - 如何根据子报表中的记录数多次打印主报表;水晶报表
- vue.js - 我怎么能在 composition api 中观看道具?
- c# - SelectedIndex 不适用于自定义控件 WPF
- pdf - 查找加密密钥
- python - 有没有办法在 with 语句中关闭多个打开文件中的 1 个,以便在条件之后只写入其中的一个子集?