如何用FileSystemWatcher实现目录文件全删除的超时等待与异常抛出
嘿,这需求我之前做批量清理工具的时候刚好实现过,给你捋捋思路和具体代码吧!
实现思路
核心逻辑其实很清晰:我们需要定期检查目标目录里的文件数量,一旦目录为空就停止等待;如果超过设定的时长还没清空,就抛出超时异常。这里有几个关键点要注意:
- 先确认目标目录存在,避免一开始就报错
- 检查间隔要合理,太频繁占资源,太长会延迟响应
- 要不要监控子目录?得看你的具体需求,默认先只监控当前目录的文件
C# 控制台实现示例
因为是控制台应用,C#是很常用的选择,直接上代码:
using System; using System.IO; using System.Threading; class DirectoryCleanupMonitor { public static void WaitForEmptyDirectory(string targetDir, TimeSpan timeout, TimeSpan checkInterval) { // 先校验目录是否存在 if (!Directory.Exists(targetDir)) { throw new DirectoryNotFoundException($"目标目录不存在:{targetDir}"); } var startTimestamp = DateTime.Now; while (true) { // 获取当前目录下的所有文件(不包含子目录,需要的话改SearchOption.AllDirectories) var remainingFiles = Directory.GetFiles(targetDir); if (remainingFiles.Length == 0) { Console.WriteLine("✅ 目录已清空,结束等待"); return; } // 检查是否超时 if (DateTime.Now - startTimestamp > timeout) { throw new TimeoutException($"❌ 等待超时!目录仍有 {remainingFiles.Length} 个文件未删除:{string.Join(", ", remainingFiles)}"); } // 等待指定间隔后再检查 Thread.Sleep(checkInterval); Console.WriteLine($"⏳ 当前目录还有 {remainingFiles.Length} 个文件,继续等待..."); } } static void Main(string[] args) { try { // 示例:等待C盘TestDir目录清空,超时30秒,每2秒检查一次 WaitForEmptyDirectory(@"C:\TestDir", TimeSpan.FromSeconds(30), TimeSpan.FromSeconds(2)); } catch (Exception ex) { Console.WriteLine($"错误:{ex.Message}"); // 异常后退出程序,返回非0状态码 Environment.Exit(1); } } }
代码关键点说明
Directory.GetFiles默认只扫描当前目录,要是需要监控子目录里的文件,改成Directory.GetFiles(targetDir, "*", SearchOption.AllDirectories)就行- 超时时间和检查间隔可以根据实际场景调整,比如大文件删除慢的话,超时设长一点
- 异常处理部分可以根据你的需求扩展,比如记录日志之类的
Python 控制台实现示例
如果你用Python的话,这个版本也能满足需求:
import os import time def wait_for_empty_dir(target_dir, timeout_sec, check_interval_sec): # 校验目录合法性 if not os.path.isdir(target_dir): raise NotADirectoryError(f"目标目录不存在:{target_dir}") start_time = time.time() while True: # 筛选出目录下的文件(排除子目录) remaining_files = [f for f in os.listdir(target_dir) if os.path.isfile(os.path.join(target_dir, f))] if not remaining_files: print("✅ 目录已清空,结束等待") return # 检查超时 elapsed_time = time.time() - start_time if elapsed_time > timeout_sec: raise TimeoutError(f"❌ 等待超时!目录仍有 {len(remaining_files)} 个文件未删除:{', '.join(remaining_files)}") # 等待后再检查 time.sleep(check_interval_sec) print(f"⏳ 当前目录还有 {len(remaining_files)} 个文件,继续等待...") if __name__ == "__main__": try: # 示例:等待当前目录下的test_dir清空,超时30秒,每2秒检查一次 wait_for_empty_dir("./test_dir", 30, 2) except Exception as e: print(f"错误:{str(e)}") exit(1)
额外注意事项
- 临时文件处理:如果目录里有程序正在写入的临时文件(比如.tmp结尾的),可以在检查时过滤掉这些文件,或者第一次检测到文件后,等待100ms再检查一次,避免误判
- 权限问题:确保你的控制台程序有读取目标目录的权限,否则会抛出权限异常
- 子目录判断:如果你的需求是“目录下所有内容(包括子目录)都要删除”,那还要检查子目录是否为空,这个可以在代码里加额外的判断逻辑
内容的提问来源于stack exchange,提问作者User11040
相关产品推荐
相关产品推荐

