C#递归目录下所有文件夹及文件

时间:2021-08-10 12:25:53

      今天课上讲了IO操作,老师留下作业时在winForm中模拟复制剪切操作,本来不以为意,想着直接调用类库中的几个类就搞定了。但翻了半天文档没发现有针对目录的Copy类库,无奈之余打算根据源文件夹的树形结构在目标文件夹中新建这些目录,然后Copy文件。接着发现了个更为头疼的问题,就是如何获取指定目录下所有文件的树形结构以及其中的文件路径。继续翻文档依旧没发现提供好的方法,所以---自己动手丰衣足食。

      首先考虑不能直接知道文件的目录层次,就不能直接用简单的循环解决问题,思来想去貌似这东西要用到递归算法。以前就感觉递归是个神奇有让我难以理解的东西。递归解决这种想遍历目录下所有文件路径的问题确实是不二之选,不过考虑到递归效率低消耗资源(同时对于我这运算速度明显没电脑快的大脑来说更是消耗大脑细胞~~),所以打算用别的方法,但考虑到最后还是归结到递归上面了,所以就还是递归吧......。

     首先在自己的C盘建了一个文件夹用于测试,长方形表示文件夹,三角形表示文本文件(“新建文本文档.txt”)其树形结构图:

C#递归目录下所有文件夹及文件

其打印结果应该是目录列表:

  1. C:\A\B\D\G
  2. C:A\B\E\H
  3. C:\A\C\F\I
  4. C:\A\C\F\J

文件列表应该是:

  1. C:\A\B\D\新建文本文档.txt
  2. C:\A\B\E\H\新建文本文档.txt
  3. C:\A\C\新建文本文档.txt
  4. C:\A\C\F\J\新建文本文档.txt

     接下来贴上代码,代码注释挺清楚的....

public class DirectoryList
{
/*利用静态数据来存储文件路径列表*/
private static ArrayList directorysList = new ArrayList();//存储目录列表数据

public static ArrayList DirectorysList
{
get { return DirectoryList.directorysList; }
set { DirectoryList.directorysList = value; }
}
private static ArrayList fileList = new ArrayList();//存储文件路径列表

public static ArrayList FileList
{
get { return DirectoryList.fileList; }
set { DirectoryList.fileList = value; }
}
public static void GetDirectory(string sourcePath)
{
if (Directory.Exists(sourcePath))//判断源文件夹是否存在
{
string[] tmp = Directory.GetFileSystemEntries(sourcePath);//获取源文件夹中的目录及文件路径,存入字符串
//循环遍历
for (int i = 0; i < tmp.Length; i++)
{
if (File.Exists(tmp[i]))//如果是文件则存入FileList
{
FileList.Add(tmp[i]);
}
else
{
if ((Directory.GetDirectories(tmp[i])).Length == 0)//如果是最后一层目录则把其路径存入DirectorysList
{
DirectorysList.Add(tmp[i]);
}
}
//递归开始.......
GetDirectory(tmp[i]);
}
}
}
}

       在控制台调用DirectoryList的静态方法,然后读取属性,并打印。

 

  static void Main(string[] args)
{
DirectoryList.GetDirectory("C:/A");
Console.WriteLine("****************目录列表************************");
foreach (string item in DirectoryList.DirectorysList)
{
Console.WriteLine(item);
}
Console.WriteLine("****************文件列表************************");
foreach (string item in DirectoryList.FileList)
{
Console.WriteLine(item);
}
}

C#递归目录下所有文件夹及文件

新手自己捣鼓,难免有让人发笑的地方,大牛们请指正.....