如何等待os.rmdir完成删除后再执行后续操作?
问题:删除空文件夹时的文件系统同步问题
我写了一个函数,会持续删除空文件夹,直到遇到有内容的文件夹或者根目录。但现在有个问题:删除子文件夹后循环执行太快,用listdir检查父文件夹是否为空时,已经删掉的子文件夹有时候还会被检测到。加sleep(0.1)能临时解决,但这不是合理方案,需要一种能确保文件夹完全删除后再继续执行的方法。
简化后的原函数
def delete_empty_folders(top_folder: str, root_folder: str) -> None: """Keep deleting empty folders until we reach a folder with content or the root folder""" while True: if not exists(top_folder): top_folder = dirname(top_folder) continue if samefile(top_folder, root_folder): break if listdir(top_folder): break rmdir(top_folder) top_folder = dirname(top_folder) return
解决方案:等待文件夹删除确认
问题根源是文件系统的缓存机制,删除操作返回后,文件系统可能还没完成元数据同步。可以通过循环检查已删除的文件夹是否存在,直到确认它确实被移除,再继续处理父文件夹。
修改后的函数如下:
import os from os.path import exists, dirname, samefile def delete_empty_folders(top_folder: str, root_folder: str) -> None: """持续删除空文件夹,直到遇到有内容的文件夹或根目录""" while True: if not exists(top_folder): top_folder = dirname(top_folder) continue if samefile(top_folder, root_folder): break # 检查当前文件夹是否为空 if os.listdir(top_folder): break # 删除文件夹后,确认它已被彻底删除 deleted_folder = top_folder os.rmdir(deleted_folder) top_folder = dirname(top_folder) # 循环等待,直到文件系统同步完成 while exists(deleted_folder): pass # 空循环等待,直到文件夹不存在 return
补充优化
如果担心空循环占用过多CPU资源,可以在等待循环中加入极短的休眠,平衡性能和等待效率:
import time # ... 其他代码不变 ... while exists(deleted_folder): time.sleep(0.01) # 每次等待10毫秒
内容的提问来源于stack exchange,提问作者Cas
相关产品推荐
相关产品推荐

