C# 删除所有空子目录
我的任务是清理大量目录。我想从一个目录开始并删除任何不包含文件的子目录(无论多深)(文件永远不会被删除,只有目录)。如果起始目录不包含文件或子目录,则该目录将被删除。我希望有人能给我指出一些现有的代码,而不是重新发明轮子。我将使用 C# 来完成此操作。
I have a task to clean up a large number of directories. I want to start at a directory and delete any sub-directories (no matter how deep) that contain no files (files will never be deleted, only directories). The starting directory will then be deleted if it contains no files or subdirectories. I was hoping someone could point me to some existing code for this rather than having to reinvent the wheel. I will be doing this using C#.
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(10)
使用 C# 代码。
Using C# Code.
如果您可以以 .NET 4.0 为目标,则可以使用
Directory
类上的新方法来枚举目录,以便在您只想知道时列出目录中的每个文件时不会造成性能损失如果至少有一个。这些方法是:
Directory.EnumerateDirectories
Directory.EnumerateFiles
Directory.EnumerateFileSystemEntries
使用递归的可能实现:
您还提到目录树可能非常深,因此如果您探测的路径太长,您可能会遇到一些异常。
If you can target the .NET 4.0 you can use the new methods on the
Directory
class to enumerate the directories in order to not pay a performance penalty in listing every file in a directory when you just want to know if there is at least one.The methods are:
Directory.EnumerateDirectories
Directory.EnumerateFiles
Directory.EnumerateFileSystemEntries
A possible implementation using recursion:
You also mention that the directory tree could be very deep so it's possible you might get some exceptions if the path you are probing are too long.
在 C:\Windows 上对到目前为止提到的 3 种方法运行测试 1000 次,结果如下:
在空文件夹上运行测试,结果如下(再次 1000 次):
因此,当您检查空文件夹时,EnumerateFileSystemEntries 是迄今为止最好的整体结果。
Running the test on C:\Windows 1000 times on the 3 methods mentioned so far yielded this:
Running it on an empty folder yielded this (1000 times again):
So EnumerateFileSystemEntries is by far the best overall when you are checking for empty folders.
这是一个利用并行执行在某些情况下更快地完成任务的版本:
这是单线程模式下的相同代码:
...这是一些示例代码,您可以使用它来测试您的场景:
...以下是我的计算机针对广域网文件共享上的目录的一些结果。此共享当前只有 16 个子文件夹和 2277 个文件。
Here's a version that takes advantage of parallel execution to get it done faster in some cases:
Here's the same code in single threaded mode:
... and here's some sample code you could use to test results in your scenario:
... and here're some results from my machine for a directory that is on a file share across a wide area network. This share currently has only 16 subfolders and 2277 files.
从此处,用于删除空目录的 Powershell 脚本:
<强>注意:使用风险自负!
From here, Powershell script to remove empty directories:
Note: use at own risk!
如果您仅依赖
DirectoryInfo.Delete
删除空目录,则可以编写一个简洁的扩展方法用法:
If you rely on
DirectoryInfo.Delete
only deleting empty directories, you can write a succinct extension methodUsage: