Directory.Delete(path, true)
有时会失败并显示“目录不为空”?使用 Directory.Delete(myPath, true)
进行递归目录删除可能会引发 System.IO.IOException: The directory is not empty
异常。这是违反直觉的,特别是当指定 true
(递归删除)时。 预期该方法只会因文件访问问题或权限问题而失败,而不仅仅是因为目录不为空。
核心问题是,即使启用了递归,Directory.Delete
本身也不会删除目录结构中的 文件。 为了防止数据丢失,它会优先删除目录并跳过文件删除。
要可靠地删除目录及其内容,需要自定义函数。这个函数应该:
此方法可确保在尝试删除主目录之前完整且安全地删除所有文件和子文件夹。
为了增强安全性,限制可以删除的目录。 将删除限制到特定文件系统位置可防止意外或恶意删除关键数据。
以下函数演示了递归目录删除:
<code class="language-csharp">public static void DeleteDirectory(string target_dir) { string[] files = Directory.GetFiles(target_dir); string[] dirs = Directory.GetDirectories(target_dir); foreach (string file in files) { File.SetAttributes(file, FileAttributes.Normal); // Remove read-only attribute File.Delete(file); } foreach (string dir in dirs) { DeleteDirectory(dir); // Recursive call for subdirectories } Directory.Delete(target_dir, false); // Delete the directory itself (non-recursive) }</code>
这个改进的函数解决了内置Directory.Delete
方法的局限性,为递归目录删除提供了更可靠、更安全的解决方案。
以上是为什么即使启用了递归删除,'Directory.Delete(path, true)”有时也会失败?的详细内容。更多信息请关注PHP中文网其他相关文章!