[C#] 디렉토리의 모든 파일과 폴더를 삭제하는 방법은 무엇입니까?

C #을 사용하여 디렉토리에서 모든 파일과 폴더를 삭제하고 루트 디렉토리를 계속 유지하려면 어떻게해야합니까?



답변

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()사용 EnumerateFiles()하기 전에 전체 콜렉션 GetFiles()을 열거하기 전에 전체 콜렉션을 메모리에로드해야하는 위치가 아니라 전체 콜렉션이 리턴 되기 전에 열거를 시작할 수 있기 때문입니다. 여기이 인용문을 보십시오 :

따라서 많은 파일과 디렉토리로 작업 할 때 EnumerateFiles ()가 더 효율적일 수 있습니다.

동일하게 적용 EnumerateDirectories()하고 GetDirectories(). 따라서 코드는 다음과 같습니다.

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

이 질문의 목적 상 실제로 GetFiles()와 를 사용할 이유가 없습니다 GetDirectories().


답변

예, 올바른 방법입니다. 자신에게 “깨끗한”(또는 “빈”기능을 선호하는 경우) 확장 기능을 제공하려는 경우 확장 메서드를 만들 수 있습니다.

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


답변

다음 코드는 폴더를 재귀 적으로 지 웁니다.

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


답변

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

 //Or

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


답변

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

내가 사용하고 있기 때문에 여기 내 솔루션이 확대됨되지 않도록주의 Get*().ToList().ForEach(...)같은 생성하는 IEnumerable두 번합니다. 이 문제를 피하기 위해 확장 방법을 사용합니다.

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

이것이 확장 방법입니다.

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


답변

가장 간단한 방법 :

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

이로 인해 폴더에 대한 일부 권한이 지워질 수 있습니다.


답변

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

하위 폴더가 없다는 것을 알고 있다면 다음과 같은 것이 가장 쉽습니다.

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