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

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函数的核心问题

  1. 变量作用域错误:循环内仅检查外层for循环的最后一个文件,未遍历所有目录条目
  2. 列表操作逻辑混乱:a.append()返回None,赋值给file_size无意义;列表持续追加元素,无法正确反映当前文件大小状态
  3. 未区分文件与文件夹:直接用os.path.getsize()获取文件夹大小会报错,需递归计算文件夹总大小
  4. 循环条件错误:仅判断排序后列表的最后一个元素是否为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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.01 09:21:35