Python脚本自动移动文件夹文件时遇PermissionError问题求助
解决文件移动时的PermissionError问题
这个问题我太熟了!你碰到的PermissionError: [WinError 32]本质是粘贴文件的过程还没完全结束,你的程序就急着去操作这个文件了——此时系统还在占用它来完成写入,自然不让你动。
你忽略了几个关键细节:
- 只检查了文件夹里的文件数量,没确认文件是否真的“就绪”(也就是写入完成、没有被其他进程锁定)
- 手动拼接路径的方式容易出错,也不够健壮
- 无限循环没有延迟,会一直占用CPU资源
解决方案:先等文件就绪,再操作
下面是修改后的代码,解决了这些问题:
import os import time from pathlib import Path # 用Path对象处理路径,更安全优雅 dest_dir = Path('C:/Users/rajini raja/Desktop/Screenshots/') src_dir = Path('C:/Users/rajini raja/Desktop/Captured/') def is_file_ready(file_path): """判断文件是否已写入完成,无进程占用""" try: # 以读写模式尝试打开文件,能打开说明没有被锁定 with open(file_path, 'r+b'): return True except PermissionError: return False except Exception as e: # 其他异常(比如文件被删除)也返回未就绪 return False while True: # 只获取文件夹里的文件(排除子文件夹,避免误判) src_files = [f for f in src_dir.iterdir() if f.is_file()] if len(src_files) == 1: target_file = src_files[0] # 等待文件就绪,每隔0.1秒检查一次 while not is_file_ready(target_file): time.sleep(0.1) # 移动文件到目标目录(保留原文件名) dest_file = dest_dir / target_file.name target_file.rename(dest_file) print(f"成功移动文件: {target_file.name}") # 降低循环频率,减少CPU占用 time.sleep(0.5)
关键改进点说明
- 文件就绪检测:通过
is_file_ready函数尝试打开文件,只有当文件没有被其他进程占用时才会执行移动操作,从根源避免权限错误。 - 安全路径处理:用
pathlib.Path替代手动拼接路径,避免因路径分隔符、空格等问题导致的错误。 - 排除文件夹干扰:筛选出真正的文件,避免把Captured里的子文件夹当成文件处理。
- 降低CPU消耗:循环中加入
time.sleep,避免程序无意义地空转。
可选优化:检测文件稳定性
如果是大文件,写入时间较长,还可以通过检查文件大小是否稳定来判断是否写入完成:
def is_file_stable(file_path, wait_interval=0.2): """通过文件大小是否连续两次相同判断是否写入完成""" size_prev = os.path.getsize(file_path) time.sleep(wait_interval) size_curr = os.path.getsize(file_path) return size_prev == size_curr
把代码里的is_file_ready换成这个函数即可,适合处理大文件场景。
内容的提问来源于stack exchange,提问作者rajini raja
相关产品推荐
相关产品推荐

