我可以清空目录而不迭代所有文件和子文件夹吗?

问题描述 投票:0回答:4

有没有办法删除指定目录的所有文件和子目录而不迭代它们?

不优雅的解决方案:

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);
        }
    }
}
c# .net filesystems
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();
}

5
投票

为什么不优雅?它很干净,非常易读并且可以完成工作。


2
投票

嗯,你总是可以使用 Directory.Delete....

http://msdn.microsoft.com/en-us/library/aa328748%28VS.71%29.aspx

或者如果您想变得更奇特,请使用 WMI 删除该目录。


0
投票

这是一个基于OP原始代码的扩展方法,我认为它很好,并且比其他选项更具可读性。

我同意在框架中使用单一方法来删除目录内容而不删除目录会很好,但在我看来,这是下一个最好的事情。

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);
                }
            }
        }
    }
}
© www.soinside.com 2019 - 2024. All rights reserved.