使用C#,如何删除目录中的所有文件和文件夹,但仍然保留根目录?


当前回答

IO.Directory.Delete(HttpContext.Current.Server.MapPath(path), True)

你不需要更多

其他回答

使用DirectoryInfo的GetDirectories方法。

foreach (DirectoryInfo subDir in new DirectoryInfo(targetDir).GetDirectories())
                    subDir.Delete(true);
System.IO.DirectoryInfo di = new DirectoryInfo("YourPath");

foreach (FileInfo file in di.GetFiles())
{
    file.Delete(); 
}
foreach (DirectoryInfo dir in di.GetDirectories())
{
    dir.Delete(true); 
}

如果您的目录可能有许多文件,EnumerateFiles()比GetFiles()更有效,因为当您使用EnumerateFile()时,您可以在返回整个集合之前开始枚举它,而不是GetFiles(,在开始枚举之前,您需要在内存中加载整个集合。请参阅此处的引用:

因此,当您使用许多文件和目录时,EnumerateFiles()可以更有效。

这同样适用于EnumerateDirectories()和GetDirectory()。所以代码应该是:

foreach (FileInfo file in di.EnumerateFiles())
{
    file.Delete(); 
}
foreach (DirectoryInfo dir in di.EnumerateDirectories())
{
    dir.Delete(true); 
}

对于这个问题,确实没有理由使用GetFiles()和GetDirectories()。

private void ClearFolder(string FolderName)
{
    DirectoryInfo dir = new DirectoryInfo(FolderName);

    foreach(FileInfo fi in dir.GetFiles())
    {
        try
        {
            fi.Delete();
        }
        catch(Exception) { } // Ignore all exceptions
    }

    foreach(DirectoryInfo di in dir.GetDirectories())
    {
        ClearFolder(di.FullName);
        try
        {
            di.Delete();
        }
        catch(Exception) { } // Ignore all exceptions
    }
}

如果您知道没有子文件夹,那么像这样的操作可能是最简单的:

    Array.ForEach(Directory.GetFiles(folderName), File.Delete);

是的,这是正确的方法。如果你想给自己一个“干净”(或者,我更喜欢称之为“空”函数),你可以创建一个扩展方法。

public static void Empty(this System.IO.DirectoryInfo directory)
{
    foreach(System.IO.FileInfo file in directory.GetFiles()) file.Delete();
    foreach(System.IO.DirectoryInfo subDirectory in directory.GetDirectories()) subDirectory.Delete(true);
}

然后,这将允许您执行以下操作:。。

System.IO.DirectoryInfo directory = new System.IO.DirectoryInfo(@"C:\...");

directory.Empty();

我用过

Directory.GetFiles(picturePath).ToList().ForEach(File.Delete);

删除旧图片,我不需要此文件夹中的任何对象