如何捕获Directory.Delete删除锁定/占用文件/文件夹时的异常?
解决方案:更简便的捕获Directory.Delete异常的方法
首先纠正你原代码里的一个逻辑错误:你要删除修改时间早于目标时间的文件夹,但原代码里的判断条件是modification >= targetTime,这等于在尝试删除新文件夹,完全搞反了,这可能是你遇到问题的原因之一。
针对捕获锁定文件/文件夹的异常,只需要扩展catch块的异常类型,同时修正删除逻辑即可,比你遍历所有文件的方法简洁得多:
DateTime now = DateTime.Now; TimeSpan twelveHoursAgo = new TimeSpan(-12, 0, 0); DateTime targetTime = now.Add(twelveHoursAgo); string[] dirs = Directory.GetDirectories(tempPath, "*", SearchOption.TopDirectoryOnly); foreach (string dir in dirs) { DateTime modification = Directory.GetLastWriteTime(dir); // 修正逻辑:只删除早于12小时前的文件夹 if (modification < targetTime) { try { Directory.Delete(dir, true); } catch (IOException) { // 捕获文件/文件夹被占用、正在使用的异常,可按需记录日志或跳过 } catch (UnauthorizedAccessException) { // 捕获权限不足的异常,同样可按需处理 } // 可根据实际情况添加其他可能的异常类型,比如DirectoryNotFoundException等 } }
为什么原代码无法捕获异常?
你原代码的catch只捕获了IOException,但Directory.Delete可能抛出其他类型的异常(比如权限不足的UnauthorizedAccessException),这些未被捕获的异常会导致程序崩溃。同时删除逻辑的错误,可能让你误删了包含锁定文件的新文件夹,进一步触发未处理的异常。
这个方法的优势
不需要提前遍历文件夹里的所有文件去检查是否有新文件,而是直接尝试删除符合时间条件的文件夹,遇到异常就跳过或处理——这种“尝试操作再处理异常”的方式更简洁,也符合.NET文件操作的惯用思路。
内容的提问来源于stack exchange,提问作者Mr. Coz
相关产品推荐
相关产品推荐

