什么是清空目录的最佳方法?

7

有没有办法在不迭代所有文件和子目录的情况下删除指定目录中的所有文件和子目录?

不太优雅的解决方案:


public static void EmptyDirectory(string path)
{
    if (Directory.Exists(path))
    {
        // Delete all files
        foreach (var file in Directory.GetFiles(path))
        {
            File.Delete(file);
        }

        // Delete all folders
        foreach (var directory in Directory.GetDirectories(path))
        {
            Directory.Delete(directory, true);
        }
    }
}

http://social.msdn.microsoft.com/Forums/vstudio/en-US/2239b45a-3f19-4a2a-b5cd-050b3ee32b9d/how-can-i-check-folder-is-empty-or-not?forum=csharpgeneral - My-Name-Is
4个回答

10

System.IO.Directory.Delete怎么样?它有一个递归选项,你甚至在使用它。从您的代码审查来看,似乎您正在尝试做一些略微不同的事情-清空目录而不删除它,对吗?那么,您可以将其删除并重新创建它 :)


无论如何,您(或者您使用的某种方法)都必须迭代所有文件和子目录。但是,您可以同时迭代文件和目录,使用GetFileSystemInfos
foreach(System.IO.FileSystemInfo fsi in 
    new System.IO.DirectoryInfo(path).GetFileSystemInfos())
{
    if (fsi is System.IO.DirectoryInfo)
        ((System.IO.DirectoryInfo)fsi).Delete(true);
    else
        fsi.Delete();
}

这是一个不错的解决方案,但我不认为它比原始代码更优雅。我只是不明白问题出在哪里。 - Tommy Carlier
这将删除所有元数据,例如ACL和时间戳。对于特定的用例,这可能是可以接受的,也可能不可接受。 - jpaugh
@jpaugh 删除并重新创建目录可以做到这一点,但这不是这个解决方案所做的。除了被删除的文件之外,不会丢失任何ACL或时间戳,当然,那些被永久删除的文件将失去与这些文件相关的所有信息,如果期望其他结果,我无法想象。 - BlueMonkMN
@BlueMonkMN "嗯,你可以删除它并重新创建。" 你是说这与你的代码不匹配吗?我承认一开始没有仔细看代码。 - jpaugh
@jpaugh 是的,这正是我想说的。那被提出来只是一个愚蠢的选项(因此有表情符号),但代码实现了一个更严肃的解决方案,由“重新解释你的问题后,这是我得到的最好的”引入...一个不同的解决方案。 - BlueMonkMN
@BlueMonkMN 或许我太笨了,但我没有很快地理解它。我希望我的编辑符合您(多年前的!)想法。 - jpaugh

4
为什么这不优雅?它简洁易读,而且能够完成任务。

2

如果我正确理解他的帖子,他并不想删除目录,只是其中的文件和子目录。 - Tommy Carlier
1
是的,没错,但Directory.Delete仍然是最好的方法。删除目录并在其位置重新创建一个空目录比迭代更“优雅”,而且可能更快。 - TheSmurf
这种方法将无法保留任何非继承的目录权限。 - Craig

0
这是一个基于原始代码的扩展方法,我认为它非常好,并且比其他选项更易读。
我同意在框架中有一个单一的方法来删除目录内容而不删除目录本身会很好,但在我看来,这是次优选择。
using System;
using System.IO;

namespace YourNamespace
{
    public static class DirectoryInfoExtensions
    {
        public static void EmptyDirectory(this DirectoryInfo di)
        {
            if (di.Exists)
            {
                foreach (var file in di.GetFiles())
                {
                    file.Delete();
                }

                foreach (var directory in di.GetDirectories())
                {
                    directory.Delete(true);
                }
            }
        }
    }
}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接