如何确保第三方应用写入文件完成后再用Python脚本复制备份?
这确实是个非常典型的场景——当你没法控制那个写入文件的应用时,不小心复制到半截文件的坑真的很容易踩。我来分享几个经过实践验证的判断方法,帮你实现安全的自动备份:
判断文件写入完成的实用方案
1. 监控文件大小是否稳定
应用在写入文件的过程中,文件大小会持续波动增长。你可以周期性检查文件的大小,如果连续几次(比如间隔1-2秒)检测到的大小完全一致,基本可以判定文件已经写入完成。
示例代码:
import os import time def is_file_stable(file_path, check_interval=1, check_times=3): prev_size = -1 for _ in range(check_times): current_size = os.path.getsize(file_path) if current_size != prev_size: prev_size = current_size time.sleep(check_interval) else: return True return False
⚠️ 注意:如果应用是分批写入、中间有较长停顿的情况,可能会出现误判,所以需要根据实际场景调整检查间隔和次数。
2. 尝试以独占模式打开文件
绝大多数操作系统中,应用正在写入文件时会持有文件的写入锁。你可以尝试以只读+独占的模式打开目标文件,如果能成功打开,说明应用已经释放了文件锁,写入操作完成。
Windows 系统适配代码:
import os import time def wait_for_file_win(file_path): while True: try: # Windows下用O_EXCL标记实现独占打开 fd = os.open(file_path, os.O_RDONLY | os.O_EXCL) os.close(fd) return True except PermissionError: # 文件被占用,等待1秒后重试 time.sleep(1)
Linux/macOS 系统适配代码:
Unix类系统可以借助fcntl模块尝试加共享锁,若应用持有排他锁则会失败:
import fcntl import time def wait_for_file_unix(file_path): while True: try: with open(file_path, 'r') as f: # 尝试非阻塞加共享锁 fcntl.flock(f, fcntl.LOCK_SH | fcntl.LOCK_NB) return True except BlockingIOError: time.sleep(1)
这个方法是相对最可靠的,直接利用操作系统的文件锁机制,误判概率极低。
3. 监控文件的修改时间
文件在写入过程中,修改时间(mtime)会不断更新。你可以先记录当前的修改时间,等待一段时间后再次检查,如果修改时间没有变化,说明写入已经停止。
示例代码:
import os import time def is_file_modified_done(file_path, wait_time=2): initial_mtime = os.path.getmtime(file_path) time.sleep(wait_time) return os.path.getmtime(file_path) == initial_mtime
这个方法适合写入速度较慢的场景,但如果应用写完内容后没有立刻关闭文件,可能会有一定的延迟。
关于 shutil.copyfile 的安全性
shutil.copyfile 本身的逻辑是安全的——它会完整读取源文件内容后再写入目标文件,但问题在于如果源文件还在写入,它读取的就是当前的不完整内容。所以核心前提是:先确认文件写入完成,再调用复制函数。
你可以把判断逻辑和复制逻辑结合起来,比如:
import shutil def safe_backup(src_path, dst_path): # 先等待文件写入完成(这里用你选择的判断函数,比如wait_for_file_win) wait_for_file_win(src_path) # 执行安全复制 shutil.copyfile(src_path, dst_path)
额外的优化小技巧
- 如果应用A有特定的写入规则(比如先写入临时文件,完成后再重命名为最终文件名),那直接监控最终文件名的出现就好——原子性的重命名操作意味着,只要目标文件名存在,文件就是完整的,这是最理想的情况,一定要优先利用。
- 可以结合多种判断方法,比如先检查大小稳定,再尝试独占打开,双重验证能进一步降低误判风险。
内容的提问来源于stack exchange,提问作者Mazinga
相关产品推荐
相关产品推荐

