Cannot delete directory with Directory.Delete(path, true)
在.NET 3.5中,使用Directory.Delete(myPath, true)
进行递归删除目录时,可能会遇到以下问题:
1System.IO.IOException: The directory is not empty.
2 at System.IO.__Error.WinIOError(Int32 errorCode, String maybeFullPath)
3 at System.IO.Directory.DeleteHelper(String fullPath, String userPath, Boolean recursive)
4 at System.IO.Directory.Delete(String fullPath, String userPath, Boolean recursive)
5 ...
根据我的理解,当目录中有文件被占用或存在权限问题时,这个方法会抛出异常。但通常情况下,它应该能够删除目录及其所有内容。
然而,有时会出现上述异常,即使指定了recursive
参数为true
。(我清楚地知道目录不是空的。)
这种情况是因为有其他线程或进程正在向目录中添加文件,导致删除过程中抛出异常。具体的执行顺序如下:
删除器进程 A:
- 清空目录。
- 删除(现在为空的)目录。
如果在步骤1和步骤2之间的某个时刻,有其他线程向目录中添加了一个文件,那么步骤2就会抛出上述异常。
解决这个问题的方法是找到锁定目录或文件的来源,并尝试消除这个锁定。你可以使用下面的代码来删除目录及其内容:
1public static void DeleteDirectory(string target_dir)
2{
3 string[] files = Directory.GetFiles(target_dir);
4 string[] dirs = Directory.GetDirectories(target_dir);
5
6 foreach (string file in files)
7 {
8 File.SetAttributes(file, FileAttributes.Normal);
9 File.Delete(file);
10 }
11
12 foreach (string dir in dirs)
13 {
14 DeleteDirectory(dir);
15 }
16
17 Directory.Delete(target_dir, false);
18}
你可能还希望在删除文件之前取消文件的只读属性,以免抛出异常。另外,你可以在删除之前限制只能删除指定的目录,避免误删了系统关键目录。
总的来说,这个问题的解决方案可能因具体情况而异,你可以根据实际需求进行调整和改进。希望以上内容对你有帮助。
相关文章推荐
- C#中的throw和throw ex的区别
- Pass Method as Parameter using C\#
- 在使用String.Format时转义花括号
- 在C#中将字节数组写入文件
- 如何去除.NET DateTime中的毫秒
- <html>
- 如何在C#中获取当前可执行文件名
- 解决JSON.NET的"Self referencing loop detected for type"错误
- +# C#中如何获取当前用户桌面的路径
- 使用字符串格式化显示带两位小数或整数的数字
- 在ASP.NET中创建文件夹(文件夹不存在时)
- C++11中Reflector的开源替代品
- <!DOCTYPE html>
- 在C++中使用`noexcept`
- 在Ruby中为什么使用`rescue Exception => e`是不好的风格?
- 将Linq查询结果转换为字典