gsh*_*arp 777
System.IO.DirectoryInfo di = new DirectoryInfo("YourPath");
foreach (FileInfo file in di.GetFiles())
{
file.Delete();
}
foreach (DirectoryInfo dir in di.GetDirectories())
{
dir.Delete(true);
}
Run Code Online (Sandbox Code Playgroud)
如果您的目录可能包含许多文件,EnumerateFiles()
则效率更高GetFiles()
,因为在您使用EnumerateFiles()
时可以在返回整个集合之前开始枚举它,而不是GetFiles()
在开始枚举之前需要在内存中加载整个集合的位置.在这里看到这个引用:
因此,当您使用许多文件和目录时,EnumerateFiles()可以更有效.
这同样适用于EnumerateDirectories()
和GetDirectories()
.所以代码是:
foreach (FileInfo file in di.EnumerateFiles())
{
file.Delete();
}
foreach (DirectoryInfo dir in di.EnumerateDirectories())
{
dir.Delete(true);
}
Run Code Online (Sandbox Code Playgroud)
出于这个问题的目的,没有理由使用GetFiles()
和GetDirectories()
.
Ada*_*son 169
是的,这是正确的方法.如果你想给自己一个"干净"(或者,我更喜欢称之为"清空"功能),你可以创建一个扩展方法.
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);
}
Run Code Online (Sandbox Code Playgroud)
这将允许你做类似的事情..
System.IO.DirectoryInfo directory = new System.IO.DirectoryInfo(@"C:\...");
directory.Empty();
Run Code Online (Sandbox Code Playgroud)
小智 70
以下代码将递归清除该文件夹:
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();
}
}
Run Code Online (Sandbox Code Playgroud)
Thu*_*ram 38
new System.IO.DirectoryInfo(@"C:\Temp").Delete(true);
//Or
System.IO.Directory.Delete(@"C:\Temp", true);
Run Code Online (Sandbox Code Playgroud)
ras*_*asx 37
我们也可以表达对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));
Run Code Online (Sandbox Code Playgroud)
请注意,我的解决方案不具备性能,因为我使用的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));
Run Code Online (Sandbox Code Playgroud)
这是扩展方法:
/// <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);
}
}
}
Run Code Online (Sandbox Code Playgroud)
小智 34
最简单的方法:
Directory.Delete(path,true);
Directory.CreateDirectory(path);
Run Code Online (Sandbox Code Playgroud)
请注意,这可能会删除该文件夹的某些权限.
zum*_*ard 29
基于hiteshbiblog,您可能应该确保该文件是可读写的.
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
}
}
Run Code Online (Sandbox Code Playgroud)
如果你知道没有子文件夹,这样的东西可能是最简单的:
Directory.GetFiles(folderName).ForEach(File.Delete)
Run Code Online (Sandbox Code Playgroud)
Mac*_*ver 12
System.IO.Directory.Delete(installPath, true);
System.IO.Directory.CreateDirectory(installPath);
Run Code Online (Sandbox Code Playgroud)
Moh*_*ani 11
我用了
Directory.GetFiles(picturePath).ToList().ForEach(File.Delete);
Run Code Online (Sandbox Code Playgroud)
删除旧图片,我不需要此文件夹中的任何对象
小智 8
我知道这是一个古老的问题,但这是(也许是新的)正确答案:
new DirectoryInfo(folder).Delete(true);
Directory.CreateDirectory(folder);
Run Code Online (Sandbox Code Playgroud)
删除所有递归文件,然后重新创建文件夹。
PS-必须有参考using System.IO;
我试过的每一种方法,都在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);
Run Code Online (Sandbox Code Playgroud)
小智 6
以下代码将清除目录,但保留根目录(递归).
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);
Run Code Online (Sandbox Code Playgroud)
仅对 File 和 Directory 使用静态方法而不是 FileInfo 和 DirectoryInfo 会执行得更快。(请参阅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);
}
}
Run Code Online (Sandbox Code Playgroud)
string directoryPath = "C:\Temp";
Directory.GetFiles(directoryPath).ToList().ForEach(File.Delete);
Directory.GetDirectories(directoryPath).ToList().ForEach(Directory.Delete);
Run Code Online (Sandbox Code Playgroud)
小智 5
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();
}
}
Run Code Online (Sandbox Code Playgroud)
这是我阅读所有帖子后使用的工具。确实
它处理
它不使用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;
}
Run Code Online (Sandbox Code Playgroud)
归档时间: |
|
查看次数: |
603911 次 |
最近记录: |