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

如何让自动下载整理脚本忽略未完成下载文件直至其下载完成?

解决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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.04.30 13:17:50