882 Stimmen

Wie lösche ich alle Dateien und Ordner in einem Verzeichnis?

Wie kann ich mit C# alle Dateien und Ordner aus einem Verzeichnis löschen, aber das Root-Verzeichnis beibehalten?

0 Stimmen

s

42voto

zumalifeguard Punkte 8227
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
    }
}

Wenn Sie wissen, dass es keine Unterordner gibt, ist so etwas vielleicht am einfachsten:

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

0 Stimmen

P

40voto

rasx Punkte 5199

Wir können auch Liebe zeigen für 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));

Beachten Sie, dass meine Lösung hier nicht performant ist, weil ich die Get*().ToList().ForEach(...) die das gleiche erzeugt IEnumerable zweimal. Ich verwende eine Erweiterungsmethode, um dieses Problem zu vermeiden:

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

Dies ist die Erweiterungsmethode:

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

23voto

Mohammad Farahani Punkte 513

Ich habe

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

um das alte Bild zu löschen, und ich brauche kein Objekt in diesem Ordner

14voto

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

9voto

Eric Bole-Feysot Punkte 12201

Hier ist das Werkzeug, das ich nach dem Lesen aller Beiträge ausgewählt habe. Es tut

  • Löscht alles, was gelöscht werden kann
  • Gibt false zurück, wenn einige Dateien im Ordner verbleiben

Sie befasst sich mit

  • Schreibgeschützte Dateien
  • Verzögerung der Löschung
  • Gesperrte Dateien

Es wird nicht Directory.Delete verwendet, da der Prozess bei einer Ausnahme abgebrochen wird.

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

0 Stimmen

W

0 Stimmen

@

0 Stimmen

F

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X