디렉토리의 모든 파일과 폴더를 삭제하는 방법은 무엇입니까?
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()
.
예, 그게 올바른 방법입니다. 자신에게 "Clean"(또는 "Empty"함수라고 부르는 것을 선호 함)을 제공하려는 경우 확장 메서드를 만들 수 있습니다.
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)
System.IO.Directory.Delete(installPath, true);
System.IO.Directory.CreateDirectory(installPath);
내가 시도한 모든 방법은 System.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);
다음 코드는 디렉터리를 정리하지만 루트 디렉터리는 그대로 둡니다 (재귀 적).
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);
모든 게시물을 읽은 후 끝낸 도구는 다음과 같습니다. 그렇습니다
- 삭제할 수있는 모든 항목을 삭제합니다.
- 일부 파일이 폴더에 남아 있으면 false를 반환합니다.
그것은 다룬다
- 읽기 전용 파일
- 삭제 지연
- 잠긴 파일
예외로 인해 프로세스가 중단되기 때문에 Directory.Delete를 사용하지 않습니다.
/// <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;
}
FileInfo 및 DirectoryInfo 대신 File 및 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);
}
}
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에서 Windows 탐색기를 사용하여 수동으로 만든 경우 디렉터리 구조는 다음과 유사합니다.
C:
\AAA
\BBB
\CCC
\DDD
그리고 C : \ AAA 디렉토리를 정리하기 위해 원래 질문에서 제안 된 코드를 실행하면 di.Delete(true)
BBB를 삭제하려고 할 때 항상 IOException "디렉토리가 비어 있지 않습니다"와 함께 행 이 실패합니다. 아마도 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);
}
}
string directoryPath = "C:\Temp";
Directory.GetFiles(directoryPath).ToList().ForEach(File.Delete);
Directory.GetDirectories(directoryPath).ToList().ForEach(Directory.Delete);
이 버전은 재귀 호출을 사용하지 않으며 읽기 전용 문제를 해결합니다.
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.GetFiles(picturePath).ToList().ForEach(File.Delete);
오래된 사진을 삭제하고이 폴더에 개체가 필요하지 않습니다.
DirectoryInfo의 GetDirectories 메서드를 사용하십시오.
foreach (DirectoryInfo subDir in new DirectoryInfo(targetDir).GetDirectories())
subDir.Delete(true);
다음 예는이를 수행하는 방법을 보여줍니다. 먼저 일부 디렉토리와 파일을 만든 다음 다음을 통해 제거합니다 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 에서 가져 왔습니다 .
위의 문제를 처리하는 가장 좋은 방법은 아닙니다. 그러나 그것은 대안입니다 ...
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]);
}
DirectoryInfo Folder = new DirectoryInfo(Server.MapPath(path));
if (Folder .Exists)
{
foreach (FileInfo fl in Folder .GetFiles())
{
fl.Delete();
}
Folder .Delete();
}
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");
}
}
}
이것은 우리가 폴더를 삭제하고 우리가 텍스트 상자를 사용하여 그것을 확인하는 방법을 보여줄 것입니다
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();
}
}
}
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);
}
폴더를 삭제하려면 텍스트 상자와 버튼을 사용하는 코드입니다 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);
}
}
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
}
해야 할 유일한 일은로 설정 optional recursive parameter
하는 것 True
입니다.
Directory.Delete("C:\MyDummyDirectory", True)
.NET 덕분입니다. :)
IO.Directory.Delete(HttpContext.Current.Server.MapPath(path), True)
그 이상은 필요 없어
참고 URL : https://stackoverflow.com/questions/1288718/how-to-delete-all-files-and-folders-in-a-directory
'Nice programing' 카테고리의 다른 글
REST API 오류 반환 우수 사례 (0) | 2020.10.02 |
---|---|
Git에서 마스터에서 브랜치로 변경 사항 가져 오기 (0) | 2020.10.02 |
원격을 특정 커밋으로 재설정 (0) | 2020.10.02 |
한 분기에서 다른 분기로 커밋을 복사하는 방법은 무엇입니까? (0) | 2020.09.30 |
속성 값으로 객체 배열에서 JavaScript 객체 가져 오기 [duplicate] (0) | 2020.09.30 |