C# 取得1个文件夹内的子文件夹和文件 删除文件 文件取消只读

ygm8611 2019-05-22 12:15:45
//取得1個文件夾內的子文件夾和文件
private static void GetFilesAndDir(DirectoryInfo dir)
{
foreach (FileInfo fileInfo in dir.GetFiles()) //遍历当前文件夹内的所有文件
{
if (fileInfo.IsReadOnly) //文件是只读的取消只读权限
{
fileInfo.Attributes = FileAttributes.Normal;
}

fileInfo.Delete(); //删除文件
}

foreach (DirectoryInfo directory in dir.GetDirectories()) //遍历文件夹下面的子文件夹
{
GetFilesAndDir(directory); //取出某个子文件夹继续找 这就需要用到递归调用
}
}
...全文
148 8 打赏 收藏 转发到动态 举报
写回复
用AI写文章
8 条回复
切换为时间正序
请发表友善的回复…
发表回复
ygm8611 2019-05-27
  • 打赏
  • 举报
回复
引用 6 楼 wid999 的回复:
如果能确定文件夹中的文件都有删除权限的话,System.IO.DirectoryInfo.Delete(True)直接可以删光光。另外,这就是简单的递归,没有那么多说法。
引用 5 楼 ygm8611 的回复:
……………………


您这个写的非常惟妙惟肖,能否加我微信haiyu7891. 我目前是学习C#基础部分,想请教高手一些问题。今后有细节上不懂的请教您也可以发您微信红包。交个良师益友。

您写的我大体分析出来了
C#
文件操作之删除文件夹内的子文件夹和文件,最后删除掉选择的文件夹

嵌套递归调用典型

原理:通过嵌套循环递归调用自定义的方法删除选择的文件夹和最里面的文件。
重点是 嵌套循环和递归调用。

通过循环和递归调用找到选择的文件夹里最里面的1个文件夹,删除里面的文件,然后删除这个文件夹。
因为是嵌套循环,所以最里面1层循环结束后会跳到外面1层循环。
通过调试观察可以发现。
在窗体文件里
#region 选择1个文件夹
private void btnOpenDirctory_Click(object sender, EventArgs e)
{
lblDir.Text = "";
folderBrowserDialog.Description = "请选择文件夹";
folderBrowserDialog.ShowNewFolderButton = false; //取消显示新建文件夹
if (folderBrowserDialog.ShowDialog() != DialogResult.OK)
{
return;
}
lblDir.Text = folderBrowserDialog.SelectedPath;
}
#endregion


#region 删除选择的文件夹里的所有文件
private void btnDelDir_Click(object sender, EventArgs e)
{
string sDir = lblDir.Text.Trim();
if (sDir.Trim() == "")
{
MessageBox.Show("请选择1个文件夹!");
return;
}

DirectoryInfo diToDel = new DirectoryInfo(lblDir.Text);
DirFileRelative.DelTree(diToDel);
}
#endregion


在类文件里
public static class DirFileRelative
{
public static void DelTree(DirectoryInfo diToDel)
{
DirectoryInfo[] di = diToDel.GetDirectories(); //取得选择的文件里的所有子文件夹

foreach (DirectoryInfo diT in di) //子文件夹里有文件夹的递归调用,直到深入到最里面的1个文件夹
DelTree(diT);

FileInfo[] fi = diToDel.GetFiles(); //取得文件夹里的所有文件
foreach (FileInfo fiT in fi) //删除文件夹里的所有文件
{
Console.WriteLine("正在删除{0}", fiT.FullName);
fiT.SetAccessControl(new FileSecurity(fiT.FullName, AccessControlSections.All));
fiT.Attributes = FileAttributes.Normal;
fiT.Delete();
}

Console.WriteLine("正在删除{0}", diToDel.FullName); //删除文件夹
diToDel.SetAccessControl(new DirectorySecurity(diToDel.FullName, AccessControlSections.All));
diToDel.Attributes = FileAttributes.Normal;
diToDel.Delete();
Console.WriteLine("完成!希望没删掉不该删的文件^_^");
}
}


wid999 2019-05-27
  • 打赏
  • 举报
回复
引用 7 楼 ygm8611 的回复:
...

我是业余的,现在的职业是水电工……
wid999 2019-05-24
  • 打赏
  • 举报
回复
如果能确定文件夹中的文件都有删除权限的话,System.IO.DirectoryInfo.Delete(True)直接可以删光光。另外,这就是简单的递归,没有那么多说法。
引用 5 楼 ygm8611 的回复:
……………………
wid999 2019-05-23
  • 打赏
  • 举报
回复
少了一句。
    class Program
{
static void Main(string[] args)
{
IOop ioop = new IOop();
Console.WriteLine("危险示例!");
ioop.DelTree(new System.IO.DirectoryInfo(@"C:\"));
Console.ReadKey();
}
}

class IOop
{
internal void DelTree(System.IO.DirectoryInfo diToDel)
{
System.IO.DirectoryInfo[] di = diToDel.GetDirectories();
foreach (System.IO.DirectoryInfo diT in di)
DelTree(diT);
System.IO.FileInfo[] fi = diToDel.GetFiles();
foreach (System.IO.FileInfo fiT in fi)
{
Console.WriteLine("正在删除{0}", fiT.FullName);
fiT.SetAccessControl(new System.Security.AccessControl.FileSecurity(fiT.FullName, System.Security.AccessControl.AccessControlSections.All));
fiT.Attributes = System.IO.FileAttributes.Normal;
fiT.Delete();
}
Console.WriteLine("正在删除{0}", diToDel.FullName);
diToDel.SetAccessControl(new System.Security.AccessControl.DirectorySecurity(diToDel.FullName, System.Security.AccessControl.AccessControlSections.All));
diToDel.Attributes = System.IO.FileAttributes.Normal;
diToDel.Delete();
Console.WriteLine("完成!希望没删掉不该删的文件^_^");
}
}
wid999 2019-05-23
  • 打赏
  • 举报
回复
    class Program
{
static void Main(string[] args)
{
IOop ioop = new IOop();
Console.WriteLine("危险示例!");
ioop.DelTree(new System.IO.DirectoryInfo(@"C:\"));
Console.ReadKey();
}
}

class IOop
{
internal void DelTree(System.IO.DirectoryInfo diToDel)
{
System.IO.DirectoryInfo[] di = diToDel.GetDirectories();
foreach (System.IO.DirectoryInfo diT in di)
DelTree(diT);
System.IO.FileInfo[] fi = diToDel.GetFiles();
foreach (System.IO.FileInfo fiT in fi)
{
fiT.SetAccessControl(new System.Security.AccessControl.FileSecurity(fiT.FullName, System.Security.AccessControl.AccessControlSections.All));
fiT.Attributes = System.IO.FileAttributes.Normal;
fiT.Delete();
}
diToDel.SetAccessControl(new System.Security.AccessControl.DirectorySecurity(diToDel.FullName, System.Security.AccessControl.AccessControlSections.All));
diToDel.Delete();
}
}
ygm8611 2019-05-23
  • 打赏
  • 举报
回复
引用 4 楼 wid999 的回复:
少了一句。
    class Program
{
static void Main(string[] args)
{
IOop ioop = new IOop();
Console.WriteLine("危险示例!");
ioop.DelTree(new System.IO.DirectoryInfo(@"C:\"));
Console.ReadKey();
}
}

class IOop
{
internal void DelTree(System.IO.DirectoryInfo diToDel)
{
System.IO.DirectoryInfo[] di = diToDel.GetDirectories();
foreach (System.IO.DirectoryInfo diT in di)
DelTree(diT);
System.IO.FileInfo[] fi = diToDel.GetFiles();
foreach (System.IO.FileInfo fiT in fi)
{
Console.WriteLine("正在删除{0}", fiT.FullName);
fiT.SetAccessControl(new System.Security.AccessControl.FileSecurity(fiT.FullName, System.Security.AccessControl.AccessControlSections.All));
fiT.Attributes = System.IO.FileAttributes.Normal;
fiT.Delete();
}
Console.WriteLine("正在删除{0}", diToDel.FullName);
diToDel.SetAccessControl(new System.Security.AccessControl.DirectorySecurity(diToDel.FullName, System.Security.AccessControl.AccessControlSections.All));
diToDel.Attributes = System.IO.FileAttributes.Normal;
diToDel.Delete();
Console.WriteLine("完成!希望没删掉不该删的文件^_^");
}
}




你这个写的还是不错的。精彩了
整个程序的原理是
通过递归调用帮你找到传入的文件夹内最里面的1个文件夹。

然后删除掉文件夹里的文件
然后删除掉这个文件夹。

是由内向外删除文件和文件夹的。

有个词汇叫 堡垒从内部攻破可能就是这种写法了。。
  • 打赏
  • 举报
回复
要表达的是?
Bridge_go 2019-05-22
  • 打赏
  • 举报
回复

110,539

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 C#
社区管理员
  • C#
  • Web++
  • by_封爱
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

让您成为最强悍的C#开发者

试试用AI创作助手写篇文章吧