Comment supprimer tous les fichiers et dossiers dans un répertoire?

en utilisant C#, Comment puis-je supprimer tous les fichiers et dossiers d'un répertoire, mais garder le répertoire racine?

522
demandé sur Carlos Muñoz 2009-08-17 19:48:19

29 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 avoir beaucoup de fichiers, EnumerateFiles() est plus efficace que GetFiles() , parce que lorsque vous utilisez EnumerateFiles() vous pouvez commencer à l'énumérer avant que toute la collection soit retournée, par opposition à GetFiles() où vous devez charger toute la collection dans la mémoire avant de commencer à l'énumérer. Voir cette citation ici :

donc, quand vous travaillez avec de nombreux fichiers et répertoires, EnumerateFiles () peuvent être plus efficaces.

il en va 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); 
}

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

640
répondu gsharp 2018-05-29 06:49:38

Oui, c'est la bonne façon de le faire. Si vous cherchez à vous donner un "propre" (ou, comme je préfère l'appeler, une 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();
161
répondu Adam Robinson 2013-07-22 11:44:52

le code suivant effacera le dossier de façon 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();
    }
}
63
répondu hiteshbiblog 2016-07-18 11:03:56

Nous pouvons aussi montrer de 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, parce que 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 l'extension de la méthode:

/// <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
répondu rasx 2015-03-23 16:59:37
 new System.IO.DirectoryInfo(@"C:\Temp").Delete(true);

 //Or

 System.IO.Directory.Delete(@"C:\Temp", true);
36
répondu Thulasiram 2016-06-24 06:40:54

la manière la plus simple:

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

soyez conscient que cela peut effacer certaines permissions sur le dossier.

25
répondu Igor Mukhachev 2016-07-24 21:58:28

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
répondu zumalifeguard 2018-04-21 19:04:42
System.IO.Directory.Delete(installPath, true);
System.IO.Directory.CreateDirectory(installPath);
12
répondu MacGyver 2015-12-23 08:53:57

chaque méthode que j'ai essayé, ils ont échoué à un moment donné avec le système.Erreurs IO. La méthode suivante fonctionne à coup sûr, même si le dossier est vide ou non, en lecture seule ou non, etc.

ProcessStartInfo Info = new ProcessStartInfo();  
Info.Arguments = "/C rd /s /q \"C:\MyFolder"";  
Info.WindowStyle = ProcessWindowStyle.Hidden;  
Info.CreateNoWindow = true;  
Info.FileName = "cmd.exe";  
Process.Start(Info); 
6
répondu Alexandru Dicu 2012-10-11 10:06:16

le code suivant nettoiera le répertoire, mais laissera le répertoire racine là (récursif).

Action<string> DelPath = null;
DelPath = p =>
{
    Directory.EnumerateFiles(p).ToList().ForEach(File.Delete);
    Directory.EnumerateDirectories(p).ToList().ForEach(DelPath);
    Directory.EnumerateDirectories(p).ToList().ForEach(Directory.Delete);
};
DelPath(path);
6
répondu hofi 2015-03-23 17:02:14

en utilisant des méthodes statiques avec File et Directory au lieu de FileInfo et DirectoryInfo sera plus rapide. (voir la réponse acceptée à Quelle est la différence entre File et FileInfo dans C#? ). Réponse indiquée comme méthode d'utilité.

public static void Empty(string directory)
{
    foreach(string fileToDelete in System.IO.Directory.GetFiles(directory))
    {
        System.IO.File.Delete(fileToDelete);
    }
    foreach(string subDirectoryToDeleteToDelete in System.IO.Directory.GetDirectories(directory))
    {
        System.IO.Directory.Delete(subDirectoryToDeleteToDelete, true);
    }
}
4
répondu Kriil 2017-05-23 11:55:03

dans Windows 7, Si vous venez de le créer manuellement avec Windows Explorer, la structure du répertoire est similaire à celle-ci:

C:
  \AAA
    \BBB
      \CCC
        \DDD

et l'exécution du code suggéré dans la question d'origine pour nettoyer le répertoire C:\AAA, la ligne di.Delete(true) échoue toujours avec IOException "le répertoire n'est pas vide" en essayant de supprimer BBB. Il est probablement en raison d'une certaine sorte de retards/cache dans Windows Explorer.

le code suivant fonctionne de manière fiable pour moi:

static void Main(string[] args)
{
    DirectoryInfo di = new DirectoryInfo(@"c:\aaa");
    CleanDirectory(di);
}

private static void CleanDirectory(DirectoryInfo di)
{
    if (di == null)
        return;

    foreach (FileSystemInfo fsEntry in di.GetFileSystemInfos())
    {
        CleanDirectory(fsEntry as DirectoryInfo);
        fsEntry.Delete();
    }
    WaitForDirectoryToBecomeEmpty(di);
}

private static void WaitForDirectoryToBecomeEmpty(DirectoryInfo di)
{
    for (int i = 0; i < 5; i++)
    {
        if (di.GetFileSystemInfos().Length == 0)
            return;
        Console.WriteLine(di.FullName + i);
        Thread.Sleep(50 * i);
    }
}
3
répondu farfareast 2015-03-23 17:01:36
string directoryPath = "C:\Temp";
Directory.GetFiles(directoryPath).ToList().ForEach(File.Delete);
Directory.GetDirectories(directoryPath).ToList().ForEach(Directory.Delete);
2
répondu AVH 2012-06-14 17:41:18

cette version n'utilise pas d'appels récursifs, et résout le problème de lecture seule.

public static void EmptyDirectory(string directory)
{
    // First delete all the files, making sure they are not readonly
    var stackA = new Stack<DirectoryInfo>();
    stackA.Push(new DirectoryInfo(directory));

    var stackB = new Stack<DirectoryInfo>();
    while (stackA.Any())
    {
        var dir = stackA.Pop();
        foreach (var file in dir.GetFiles())
        {
            file.IsReadOnly = false;
            file.Delete();
        }
        foreach (var subDir in dir.GetDirectories())
        {
            stackA.Push(subDir);
            stackB.Push(subDir);
        }
    }

    // Then delete the sub directories depth first
    while (stackB.Any())
    {
        stackB.Pop().Delete();
    }
}
2
répondu Jeppe Andreasen 2015-10-23 08:26:10
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();
    }
}
2
répondu Mong Zhu 2016-11-28 13:28:25

Voici l'outil avec lequel j'ai fini après avoir lu tous les messages. Il n'

  • supprime tout ce qui peut être supprimé
  • retourne false si certains fichiers restent dans le dossier

Il traite de

  • Readonly fichiers
  • la Suppression retard
  • fichiers verrouillés

il n'utilise pas de répertoire.Supprimer parce que le processus est abandonnée sur une exception.

    /// <summary>
    /// Attempt to empty the folder. Return false if it fails (locked files...).
    /// </summary>
    /// <param name="pathName"></param>
    /// <returns>true on success</returns>
    public static bool EmptyFolder(string pathName)
    {
        bool errors = false;
        DirectoryInfo dir = new DirectoryInfo(pathName);

        foreach (FileInfo fi in dir.EnumerateFiles())
        {
            try
            {
                fi.IsReadOnly = false;
                fi.Delete();

                //Wait for the item to disapear (avoid 'dir not empty' error).
                while (fi.Exists)
                {
                    System.Threading.Thread.Sleep(10);
                    fi.Refresh();
                }
            }
            catch (IOException e)
            {
                Debug.WriteLine(e.Message);
                errors = true;
            }
        }

        foreach (DirectoryInfo di in dir.EnumerateDirectories())
        {
            try
            {
                EmptyFolder(di.FullName);
                di.Delete();

                //Wait for the item to disapear (avoid 'dir not empty' error).
                while (di.Exists)
                {
                    System.Threading.Thread.Sleep(10);
                    di.Refresh();
                }
            }
            catch (IOException e)
            {
                Debug.WriteLine(e.Message);
                errors = true;
            }
        }

        return !errors;
    }
2
répondu Eric Bole-Feysot 2018-05-18 06:30:59

utilisez la méthode GetDirectories de DirectoryInfo.

foreach (DirectoryInfo subDir in new DirectoryInfo(targetDir).GetDirectories())
                    subDir.Delete(true);
1
répondu Mr_Hmp 2015-05-27 18:57:37

L'exemple suivant montre comment vous pouvez le faire. Il crée d'abord quelques répertoires et un fichier, puis les supprime via Directory.Delete(topPath, true); :

    static void Main(string[] args)
    {
        string topPath = @"C:\NewDirectory";
        string subPath = @"C:\NewDirectory\NewSubDirectory";

        try
        {
            Directory.CreateDirectory(subPath);

            using (StreamWriter writer = File.CreateText(subPath + @"\example.txt"))
            {
                writer.WriteLine("content added");
            }

            Directory.Delete(topPath, true);

            bool directoryExists = Directory.Exists(topPath);

            Console.WriteLine("top-level directory exists: " + directoryExists);
        }
        catch (Exception e)
        {
            Console.WriteLine("The process failed: {0}", e.Message);
        }
    }

il est tiré de https://msdn.microsoft.com/en-us/library/fxeahc5f (v=V110).aspx .

1
répondu Salma Tofaily 2016-07-25 15:01:46

ce n'est pas la meilleure façon de traiter la question ci-dessus. Mais c'est une alternative...

while (Directory.GetDirectories(dirpath).Length > 0)
 {
       //Delete all files in directory
       while (Directory.GetFiles(Directory.GetDirectories(dirpath)[0]).Length > 0)
       {
            File.Delete(Directory.GetFiles(dirpath)[0]);
       }
       Directory.Delete(Directory.GetDirectories(dirpath)[0]);
 }
1
répondu dsmyrnaios 2016-07-26 14:18:17
DirectoryInfo Folder = new DirectoryInfo(Server.MapPath(path)); 
if (Folder .Exists)
{
    foreach (FileInfo fl in Folder .GetFiles())
    {
        fl.Delete();
    }

    Folder .Delete();
}
0
répondu Ashok Luhach 2013-04-11 07:32:31
using System;
using System.IO;
namespace DeleteFoldersAndFilesInDirectory
{
     class Program
     {
          public static void DeleteAll(string path)
          {
               string[] directories = Directory.GetDirectories(path);
               string[] files = Directory.GetFiles(path);
               foreach (string x in directories)
                    Directory.Delete(x, true);
               foreach (string x in files)
                    File.Delete(x);
          }
          static void Main()
          {
               Console.WriteLine("Enter The Directory:");
               string directory = Console.ReadLine();
               Console.WriteLine("Deleting all files and directories ...");
               DeleteAll(directory);
               Console.WriteLine("Deleted");
          }
     }
}
0
répondu Diaa Eddin 2014-05-30 17:08:19

cela montrera comment nous supprimons le dossier et cochez-le nous utilisons la zone de texte

using System.IO;
namespace delete_the_folder
{
public partial class Form1 : Form
{
    public Form1()
    {
        InitializeComponent();
    }

    private void Deletebt_Click(object sender, EventArgs e)
    {
        //the  first you should write the folder place
        if (Pathfolder.Text=="")
        {
            MessageBox.Show("ples write the path of the folder");
            Pathfolder.Select();
            //return;
        }

        FileAttributes attr = File.GetAttributes(@Pathfolder.Text);

        if (attr.HasFlag(FileAttributes.Directory))
            MessageBox.Show("Its a directory");
        else
            MessageBox.Show("Its a file");

        string path = Pathfolder.Text;
        FileInfo myfileinf = new FileInfo(path);
        myfileinf.Delete();

    }


}

}
0
répondu Abdelrhman Khalil 2015-06-30 08:44:32
using System.IO;

string[] filePaths = Directory.GetFiles(@"c:\MyDir\");

foreach (string filePath in filePaths)

File.Delete(filePath);
0
répondu SynsMasTer 2015-11-30 17:58:03

appel de main

static void Main(string[] args)
{ 
   string Filepathe =<Your path>
   DeleteDirectory(System.IO.Directory.GetParent(Filepathe).FullName);              
}

ajouter cette méthode

public static void DeleteDirectory(string path)
{
    if (Directory.Exists(path))
    {
        //Delete all files from the Directory
        foreach (string file in Directory.GetFiles(path))
        {
            File.Delete(file);
        }
        //Delete all child Directories
        foreach (string directory in Directory.GetDirectories(path))
        {
             DeleteDirectory(directory);
        }
        //Delete a Directory
        Directory.Delete(path);
    }
 }
0
répondu sansalk 2016-07-18 08:42:43
 foreach (string file in System.IO.Directory.GetFiles(path))
 {
    System.IO.File.Delete(file);
 }

 foreach (string subDirectory in System.IO.Directory.GetDirectories(path))
 {
     System.IO.Directory.Delete(subDirectory,true); 
 } 
0
répondu Manish Y 2016-07-18 09:17:38

pour supprimer le dossier, il s'agit d'un code à l'aide d'une zone de texte et d'un bouton using System.IO; :

private void Deletebt_Click(object sender, EventArgs e)
{
    System.IO.DirectoryInfo myDirInfo = new DirectoryInfo(@"" + delete.Text);

    foreach (FileInfo file in myDirInfo.GetFiles())
    {
       file.Delete();
    }
    foreach (DirectoryInfo dir in myDirInfo.GetDirectories())
    {
       dir.Delete(true);
    }
}
0
répondu Abdelrhman Khalil 2016-07-18 09:46:58
private void ClearDirectory(string path)
{
    if (Directory.Exists(path))//if folder exists
    {
        Directory.Delete(path, true);//recursive delete (all subdirs, files)
    }
    Directory.CreateDirectory(path);//creates empty directory
}
-2
répondu dadziu 2014-02-11 08:15:33

la seule chose que vous devez faire est de mettre optional recursive parameter à True .

Directory.Delete("C:\MyDummyDirectory", True)

Merci .NET. :)

-3
répondu LysanderM 2013-12-10 16:09:43
IO.Directory.Delete(HttpContext.Current.Server.MapPath(path), True)

Vous n'avez pas besoin de plus

-4
répondu Mustafa Odeh 2013-07-16 20:03:29