Windows下Python3 shutil.copy2处理含password文件名被截断问题咨询
问题原因分析
该问题和Python内置保护机制完全无关,触发原因是Windows系统的文件名保留字符限制:
- Windows系统不允许文件名中包含冒号
:,冒号在NTFS文件系统中是特殊保留字符,用于标识「NTFS交换数据流(Alternate Data Streams,ADS)」 - 你观察到的“包含password就截断”属于巧合:你给出的目标文件名里
[Password: EL INGENIOSO HIDALGO]、[PASSWORD: CANES VENATICI]都在Password/PASSWORD后面紧跟了冒号,系统会将冒号前的内容识别为正式文件名,冒号后的内容识别为数据流名称,因此出现文件名截断到Password/PASSWORD位置的现象,文件实际数据被写入了对应数据流,主文件本身大小为0。 - 由于创建带数据流的文件属于Windows系统支持的合法操作,因此Python不会抛出任何异常,符合你观察到的“脚本全程无报错”的现象。
解决方法
在生成目标文件名时,先把所有Windows非法文件名字符替换为合法字符(如下划线、短横线等)即可。Windows下禁止出现在文件名中的字符包括:<、>、:、"、/、\、|、?、*。
示例处理代码:
import os import re import shutil def sanitize_filename(filename): # 匹配所有Windows非法文件名字符,统一替换为下划线 return re.sub(r'[<>:"/\\|?*]', '_', filename) def copy(rom, name, system): system_path = os.path.join(distFolder, system) if not os.path.exists(system_path): os.mkdir(system_path) # 先对文件名做合法性处理 safe_name = sanitize_filename(name) target_path = os.path.join(system_path, f"{safe_name}.zip") shutil.copy2(os.path.join(newRomset, system, rom), target_path)
内容的提问来源于stack exchange,提问作者Voljega
相关产品推荐
相关产品推荐

