如何让自动下载整理脚本忽略未完成下载文件直至其下载完成?
解决Firefox下载文件被脚本提前移动导致损坏的问题
嘿,这个问题我之前帮朋友处理过,Firefox的下载机制确实会给这类自动整理脚本添点小麻烦,咱们一步步来搞定它~
首先得搞清楚Firefox的下载逻辑:它在下载文件时,会先创建一个带.part后缀的临时文件,等下载完全完成(包括校验)后,才会把这个临时文件重命名成你看到的最终文件名。所以咱们可以从这个特性入手,再配合文件状态检查,就能完美避开未完成的下载。
具体解决方案
1. 过滤Firefox的临时下载文件
直接跳过所有后缀为.part的文件,这些肯定是还在下载中的,完全不用考虑移动它们。
2. 检查文件是否处于可访问状态
有时候即使文件没有.part后缀,可能刚下载完但Firefox还在做收尾处理(比如校验文件完整性),这时候文件还是被占用的,强行移动可能出问题。咱们可以加一个函数,尝试打开文件来判断它是否能安全操作。
3. 调整修改时间阈值(可选)
你原来设置的1小时阈值有点太长了,改成5分钟(300秒)会更合理,既不会太早动刚下载完的文件,也不会让下载文件夹堆积太久。
修改后的完整代码片段
import os import time from pathlib import Path from shutil import move def creation(check): x = os.stat(check) return (time.time() - x.st_mtime) def is_file_ready(file_path): """检查文件是否可以安全移动(未被其他进程占用)""" try: # 尝试以只读方式打开文件,确保没有其他进程在写入 with open(file_path, 'rb') as f: return True except (PermissionError, OSError): # 权限错误或文件被占用,说明还不能移动 return False # Directory Path PATH = Path("/Users/jobe/Downloads") for filename in PATH.iterdir(): path_to_file = filename.absolute() # 跳过Firefox未完成的下载临时文件 if filename.suffix == '.part': continue # 跳过子文件夹,只处理文件 if path_to_file.is_dir(): continue # 满足两个条件才移动:修改时间超过阈值,且文件可安全访问 if creation(path_to_file) > 300 and is_file_ready(path_to_file): destination = PATH / get_dir(filename) if not destination.exists(): destination.mkdir() move(str(path_to_file), str(destination))
额外说明
- 关于
.part后缀:这是Firefox默认的临时文件后缀,如果你修改过Firefox的下载设置,可能需要调整这个判断,但默认情况下完全有效。 - 文件占用检查:在Mac上这个方法很可靠,当文件被Firefox占用时,尝试打开会抛出异常,咱们就跳过它,等下次脚本运行时再处理。
- 子文件夹同名问题:虽然你没问这个,但可以提一句——如果遇到目标文件夹和要移动的文件同名的情况,可以在移动时给文件加个后缀(比如
_copy),或者先判断目标路径是否存在,再做重命名处理,这个可以后续再优化。
内容的提问来源于stack exchange,提问作者JTFL
相关产品推荐
相关产品推荐

