Pregunta ¿Cómo eliminar todos los archivos y carpetas en un directorio?


Al usar C #, ¿cómo puedo eliminar todos los archivos y carpetas de un directorio, pero aun así mantener el directorio raíz?


504
2017-08-17 15:48


origen


Respuestas:


System.IO.DirectoryInfo di = new DirectoryInfo("YourPath");

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

Si su directorio puede tener muchos archivos, EnumerateFiles() es más eficiente que GetFiles()porque cuando usas EnumerateFiles() puede comenzar a enumerarlo antes de que se devuelva toda la colección, en lugar de GetFiles() donde debe cargar toda la colección en memoria antes de comenzar a enumerarla. Ver esta cita aquí:

Por lo tanto, cuando trabaje con muchos archivos y directorios, EnumerateFiles () puede ser más eficiente.

Lo mismo aplica a EnumerateDirectories() y GetDirectories(). Entonces el código sería:

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

Para el propósito de esta pregunta, realmente no hay razón para usar GetFiles() y GetDirectories().


609
2017-08-17 15:52



Sí, esa es la forma correcta de hacerlo. Si está buscando una función "Limpiar" (o, como prefiero llamarlo, "Vaciar"), puede crear un método de extensión.

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);
}

Esto le permitirá hacer algo como ...

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

directory.Empty();

158
2017-08-17 15:58



El siguiente código borrará la carpeta recursivamente:

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

    foreach(FileInfo fi in dir.GetFiles())
    {
        fi.Delete();
    }

    foreach (DirectoryInfo di in dir.GetDirectories())
    {
        clearFolder(di.FullName);
        di.Delete();
    }
}

61
2018-05-04 15:36



También podemos mostrar amor por LINQ:

using System.IO;
using System.Linq;
…
var directory = Directory.GetParent(TestContext.TestDir);

directory.EnumerateFiles()
    .ToList().ForEach(f => f.Delete());

directory.EnumerateDirectories()
    .ToList().ForEach(d => d.Delete(true));

Tenga en cuenta que mi solución aquí no está funcionando, porque estoy usando Get*().ToList().ForEach(...) que genera el mismo IEnumerable dos veces. Utilizo un método de extensión para evitar este problema:

using System.IO;
using System.Linq;
…
var directory = Directory.GetParent(TestContext.TestDir);

directory.EnumerateFiles()
    .ForEachInEnumerable(f => f.Delete());

directory.EnumerateDirectories()
    .ForEachInEnumerable(d => d.Delete(true));

Este es el método de extensión:

/// <summary>
/// Extensions for <see cref="System.Collections.Generic.IEnumerable"/>.
/// </summary>
public static class IEnumerableOfTExtensions
{
    /// <summary>
    /// Performs the <see cref="System.Action"/>
    /// on each item in the enumerable object.
    /// </summary>
    /// <typeparam name="TEnumerable">The type of the enumerable.</typeparam>
    /// <param name="enumerable">The enumerable.</param>
    /// <param name="action">The action.</param>
    /// <remarks>
    /// “I am philosophically opposed to providing such a method, for two reasons.
    /// …The first reason is that doing so violates the functional programming principles
    /// that all the other sequence operators are based upon. Clearly the sole purpose of a call
    /// to this method is to cause side effects.”
    /// —Eric Lippert, “foreach” vs “ForEach” [http://blogs.msdn.com/b/ericlippert/archive/2009/05/18/foreach-vs-foreach.aspx]
    /// </remarks>
    public static void ForEachInEnumerable<TEnumerable>(this IEnumerable<TEnumerable> enumerable, Action<TEnumerable> action)
    {
        foreach (var item in enumerable)
        {
            action(item);
        }
    }
}

36
2017-08-11 20:00



 new System.IO.DirectoryInfo(@"C:\Temp").Delete(true);

 //Or

 System.IO.Directory.Delete(@"C:\Temp", true);

36
2017-07-18 11:55



La forma más simple:

Directory.Delete(path,true);  
Directory.CreateDirectory(path);

Tenga en cuenta que esto puede borrar algunos permisos en la carpeta.


26
2017-08-16 08:43



Basado en hiteshbiblog, probablemente deberías asegurarte de que el archivo sea de lectura-escritura.

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

    foreach (FileInfo fi in dir.GetFiles())
    {
        fi.IsReadOnly = false;
        fi.Delete();
    }

    foreach (DirectoryInfo di in dir.GetDirectories())
    {
        ClearFolder(di.FullName);
        di.Delete();
    }
}

Si sabe que no hay subcarpetas, algo como esto puede ser el más fácil:

    Directory.GetFiles(folderName).ForEach(File.Delete)

23
2018-06-02 22:43



System.IO.Directory.Delete(installPath, true);
System.IO.Directory.CreateDirectory(installPath);

12
2017-12-23 08:53