You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.04 23:24:01