Python文件夹监控脚本异常:零大小文件/文件夹处理问题
文件夹监控Python脚本问题:零大小文件/文件夹导致异常
我正在编写一个Python脚本监控文件夹,文件由第三方GUI程序写入目标目录:
- 部分文件原地逐步增大
- 另一些先在外部tmp文件夹写入,就绪后复制到目标目录,此时目标路径会先创建空文件夹,且仅在前一个空文件夹被填充后才会创建新的空文件夹
当前脚本在无零大小文件/文件夹时运行正常,但遇到这类文件/文件夹时出现异常,核心问题出在zero_files函数中,以下是完整代码:
import os import datetime import time import itertools print('Starting to Monitor File growth') print(datetime.datetime.now()) print("") path = os.path.normpath(r'C:\Users\ed\Desktop\Test_Run') check_rate = 180 #time in seconds between checks print("Waiting for a moment before starting monitoring") print("") time.sleep(60) #wait for the first files to appear def get_directory_size(directory): """Returns the `directory` size in bytes.""" total = 0 try: # print("[+] Getting the size of", directory) for entry in os.scandir(directory): if entry.is_file(): # if it's a file, use stat() function total += entry.stat().st_size elif entry.is_dir(): # if it's a directory, recursively call this function try: total += get_directory_size(entry.path) except FileNotFoundError: pass except NotADirectoryError: # if `directory` isn't a directory, get the file size then return os.path.getsize(directory) except PermissionError: # if for whatever reason we can't open the folder, return 0 return 0 return total def folder_growing(path): sizes = [1,2] while sizes[-1] > sizes[-2]: time.sleep(check_rate) sizes.append(get_directory_size(path)) print('Monitoring Folder') def zero_files(path): files = os.listdir(path) a= [] for i in files: file_size = a.append(os.path.getsize(f'{path}\\{i}')) a.sort() try: while a[-1] == 0: file_size = a.append(os.path.getsize(f'{path}\\{i}')) a.sort() print("test") time.sleep(120) except FileNotFoundError: pass print(f"***Checking folders every", (int(check_rate/60)),"mins***") get_directory_size(path) folder_growing(path) time.sleep(120) zero_files(path) wait = 10 print('No Folder Growth Detected') print("") print(f"***Waiting ", (int(wait/60)),"mins for Safety***") time.sleep(wait) print("") print(datetime.datetime.now()) print("Done")
zero_files函数的核心问题
- 变量作用域错误:循环内仅检查外层
for循环的最后一个文件,未遍历所有目录条目 - 列表操作逻辑混乱:
a.append()返回None,赋值给file_size无意义;列表持续追加元素,无法正确反映当前文件大小状态 - 未区分文件与文件夹:直接用
os.path.getsize()获取文件夹大小会报错,需递归计算文件夹总大小 - 循环条件错误:仅判断排序后列表的最后一个元素是否为0,逻辑倒置(应该检查是否存在任何零大小条目)
修复后的zero_files函数
def zero_files(path): while True: has_zero_entry = False for entry_name in os.listdir(path): entry_path = os.path.join(path, entry_name) try: # 区分文件和文件夹,分别计算大小 if os.path.isfile(entry_path): current_size = os.path.getsize(entry_path) elif os.path.isdir(entry_path): current_size = get_directory_size(entry_path) else: continue # 跳过特殊文件(如符号链接) if current_size == 0: has_zero_entry = True break # 发现零大小条目,无需继续遍历 except (FileNotFoundError, PermissionError): # 处理文件/文件夹被删除或无权限的情况 continue if not has_zero_entry: break # 所有条目都非零,退出等待循环 print("等待零大小文件/文件夹被填充...") time.sleep(120)
额外优化点
folder_growing函数初始化优化:替换硬编码的初始大小,先获取两次实际大小再进入循环:
def folder_growing(path): sizes = [get_directory_size(path)] time.sleep(check_rate) sizes.append(get_directory_size(path)) while sizes[-1] > sizes[-2]: time.sleep(check_rate) sizes.append(get_directory_size(path)) print('监控中:文件夹大小仍在增长')
- 使用
os.path.join()拼接路径,替代硬编码的\\,提升跨平台兼容性 - 可在关键步骤添加更清晰的打印信息,方便调试运行状态
内容的提问来源于stack exchange,提问作者edfish90
相关产品推荐
相关产品推荐

