it-source

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

criticalcode 2023. 5. 1. 21:27
반응형

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

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

가장 간단한 방법:

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

이렇게 하면 폴더에 대한 일부 사용 권한이 삭제될 수 있습니다.

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

 //Or

 System.IO.Directory.Delete(@"C:\Temp", true);
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
    }
}

하위 폴더가 없는 경우 다음과 같은 방법이 가장 쉬울 수 있습니다.

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

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.GetFiles(picturePath).ToList().ForEach(File.Delete);

이전 사진을 삭제하고 이 폴더에 개체가 필요하지 않습니다.

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

여기 제가 모든 게시물을 읽고 종료한 도구가 있습니다.그래요.

  • 삭제할 수 있는 모든 항목을 삭제합니다.
  • 일부 파일이 폴더에 남아 있으면 false를 반환합니다.

에 대해 다룹니다.

  • 읽기 전용 파일
  • 삭제지연
  • 잠긴 파일

디렉토리를 사용하지 않습니다.예외 시 프로세스가 중단되므로 삭제합니다.

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

제가 시도한 모든 방법은 시스템에서 실패했습니다.IO 오류.다음 방법은 폴더가 비어 있거나 비어 있거나, 읽기 전용이거나, 그렇지 않은 경우에도 확실히 작동합니다.

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

저는 이것이 오래된 질문이라는 것을 알지만, 이것이 (아마도 새로운) 정답입니다.

new DirectoryInfo(folder).Delete(true);
Directory.CreateDirectory(folder);

모든 재귀를 삭제한 다음 폴더를 다시 만듭니다.

PS - 참조가 필요합니다.using System.IO;

string directoryPath = "C:\Temp";
Directory.GetFiles(directoryPath).ToList().ForEach(File.Delete);
Directory.GetDirectories(directoryPath).ToList().ForEach(Directory.Delete);

FileInfo 및 Directory 대신 File and Directory에 정적 메서드만 사용정보가 더 빨리 수행됩니다.(C#에서 File과 FileInfo의 차이점은 무엇입니까?에서 승인된 답변을 참조하십시오.)답변은 유틸리티 방법으로 표시됩니다.

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

다음 코드는 디렉터리를 정리하지만 루트 디렉터리는 그대로 둡니다(재귀).

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

Windows 7(윈도우 7)에서 Windows 탐색기를 사용하여 수동으로 만든 경우 디렉터리 구조는 다음과 유사합니다.

C:
  \AAA
    \BBB
      \CCC
        \DDD

C C:\chearing C.줄 AAA, 줄di.Delete(true)BBB를 삭제하려고 하면 항상 IO가 실패하고 "디렉토리가 비어 있지 않습니다"가 표시됩니다.아마도 Windows 탐색기의 일부 지연/캐시 때문일 것입니다.

다음 코드는 안정적으로 작동합니다.

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

이 버전에서는 재귀 호출을 사용하지 않으며 읽기 전용 문제를 해결합니다.

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

다음 예제에서는 이 작업을 수행하는 방법을 보여 줍니다. 먼일부디파만든다일을다음통다제다해음거니합을음저와리터를 통해 합니다.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);
        }
    }

https://msdn.microsoft.com/en-us/library/fxeahc5f(v=vs.110).aspx 에서 가져온 것입니다.

디렉터리 사용Info의 GetDirectory 메서드입니다.

foreach (DirectoryInfo subDir in new DirectoryInfo(targetDir).GetDirectories())
                    subDir.Delete(true);

입니다.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);
    }
}

위의 문제를 처리하는 가장 좋은 방법은 아닙니다.하지만 대안이 될 수도대체로...

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

디렉터리 정보.GetFileSystemInfos는 파일과 디렉토리를 모두 반환합니다. -

new DirectoryInfo(targetDir).GetFileSystemInfos().ToList().ForEach(x => x.Delete());

또는 재귀 삭제를 원하는 경우:-

        new DirectoryInfo(targetDir).GetFileSystemInfos().ToList().ForEach(x =>
        {
            if (x is DirectoryInfo di)
                di.Delete(true);
            else
                x.Delete();
        });
DirectoryInfo Folder = new DirectoryInfo(Server.MapPath(path)); 
if (Folder .Exists)
{
    foreach (FileInfo fl in Folder .GetFiles())
    {
        fl.Delete();
    }

    Folder .Delete();
}
using System.IO;

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

foreach (string filePath in filePaths)

File.Delete(filePath);

메인에서 호출

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

이 메서드 추가

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

내 경우

var PhotoFile = _context.Records.Where(x => id_or_ids.Contains(x.Id)).Select(x => x.Photo).ToList();

            System.IO.DirectoryInfo di = new DirectoryInfo("wwwroot/uploads");

            foreach (FileInfo file in di.GetFiles())
            {
                if (PhotoFile.IndexOf(file.Name) != -1)
                {
                    file.Delete();
                }
            }
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
}

이것은 폴더를 삭제하고 텍스트 상자를 사용하여 확인하는 방법을 보여줍니다.

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

    }


}

}

언급URL : https://stackoverflow.com/questions/1288718/how-to-delete-all-files-and-folders-in-a-directory

반응형