Question Comment supprimer tous les fichiers et dossiers d'un répertoire?


En utilisant C #, comment puis-je supprimer tous les fichiers et dossiers d'un répertoire, tout en conservant le répertoire racine?


504
2017-08-17 15:48


origine


Réponses:


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 votre répertoire peut contenir de nombreux fichiers, EnumerateFiles() est plus efficace que GetFiles(), parce que quand vous utilisez EnumerateFiles() vous pouvez commencer à l'énumérer avant le retour de toute la collection, par opposition à GetFiles() où vous devez charger la collection entière en mémoire avant de commencer à l'énumérer. Voir cette citation ici:

Par conséquent, lorsque vous travaillez avec de nombreux fichiers et répertoires, EnumerateFiles () peut être plus efficace.

de même pour EnumerateDirectories() et GetDirectories(). Donc le code serait:

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

Pour les besoins de cette question, il n'y a vraiment aucune raison d'utiliser GetFiles() et GetDirectories().


609
2017-08-17 15:52



Oui, c'est la bonne façon de le faire. Si vous cherchez à vous donner un "Clean" (ou, comme je préfèrerais l'appeler, fonction "Vide"), vous pouvez créer une méthode d'extension.

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

Cela vous permettra alors de faire quelque chose comme ..

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

directory.Empty();

158
2017-08-17 15:58



Le code suivant effacera le dossier de manière récursive:

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



Nous pouvons également montrer l'amour pour 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));

Notez que ma solution ici n'est pas performante, car j'utilise Get*().ToList().ForEach(...) qui génère le même IEnumerable deux fois. J'utilise une méthode d'extension pour éviter ce problème:

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

C'est la méthode d'extension:

/// <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



Le moyen le plus simple:

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

Sachez que cela peut effacer certaines autorisations sur le dossier.


26
2017-08-16 08:43



Basé sur le hiteshbiblog, vous devriez probablement vous assurer que le fichier est en lecture-écriture.

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 vous savez qu'il n'y a pas de sous-dossiers, quelque chose comme ça peut être le plus facile:

    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