c#2005中遍历文件夹中所有文件的方法(转)
最近研究了一下遍历文件的问题,写了一个遍历文件夹的方法,然后又改进了一下,不过觉得效率不是很高,希望能有更好一点的方法。下面把源代码给大家分享一下:
using System;
using System.Collections.Generic;
using System.Text;
using System.IO;
//开始之前先using前面这些命名空间
//下面写一下具体的实现方法
public FileInfo[] GetFilelist(string filePath)//返回文件列表,filePath为根目录路径
{
int filecounts = 0;//定义一个变量,表示文件数目
FileInfo[] NewFileInfo;//定义一个数组,储存找到的文件并作为返回值
DirectoryInfo FatherDirectory = new DirectoryInfo(filePath); //创建一个当前目录的实例
NewFileInfo = FatherDirectory.GetFiles("*.txt", SearchOption.AllDirectories);
//得到文件集,包括目录及其子目录下的所有txt文件,如果用"*.*"就可以获得全部文件了
//为了得到其他类型的文件,又写了下面的语句
AddNewArray<FileInfo>(ref NewFileInfo, FatherDirectory.GetFiles("*.mp3", SearchOption.AllDirectories));
//把另一个查询记录并入到这个文件列表里
return NewFileInfo;//返回文件列表
}
//下面是一个合并数组的方法
private void AddNewArray<T>(ref T[] A, T[] B)//合并数组,运用了一个范型,具体作用见下文
{
T[] A1;
A1 = (T[])A.Clone();
A = new T[A1.GetLength(0) + B.GetLength(0)];
for (int i = 0; i < A1.GetLength(0); i++)
{
A[i] = A1[i];
}
for (int i = 0; i < B.GetLength(0); i++)
{
A[i + A1.GetLength(0)] = B[i];
}
}
就是这么简单了,上文的代码直接返回了FileInfo类型的数组,也可一自己建立一个文件类,用来保护文件信息。下面是使用递归的方法进行遍历,不过效率要低些,是我一开始写的,下面也帖出来,大家可以参考一下。其中ClMyFile是自己建立的一个文件类,可以根据具体情况增减需要的属性,因为和具体遍历过程无关,省略其代码:
public ClMyFile[] GetFilelist(string filePath)
{
int filecounts = 0;//文件数目
int dircounts = 0;//目录中一级子文件夹的数量
DirectoryInfo[] ChildDirectory;//当前所有的一级子目录
FileInfo[] NewFileInfo;//当前目录下所有文件(不包含子目录中的文件)
DirectoryInfo FatherDirectory = new DirectoryInfo(filePath); //初始化当前目录
ChildDirectory = FatherDirectory.GetDirectories("*.*"); //得到子目录集
NewFileInfo = FatherDirectory.GetFiles("*.txt");//得到文件集,不包括子目录中的文件
AddNewArray<FileInfo>(ref NewFileInfo, FatherDirectory.GetFiles("*.mp3", SearchOption.AllDirectories));
//加入另一个查询记录,和上面的方法差不多
filecounts = NewFileInfo.GetLength(0);//获得当前目录下文件的数量,用来初始化文件数组长度
dircounts = ChildDirectory.GetLength(0); //获取文件数量
//××××××××××获得目录下的文件和文件夹列表××××××
ClMyFile[] myfilelist = new ClMyFile[filecounts];//初始化一个自定义类的数组,存储得到的文件列表
for (int i = 0; i < filecounts; i++)
{
myfilelist[i] = new ClMyFile();//实例化数组中的对象
myfilelist[i] = GiveMyFileInfo(NewFileInfo[i]);//使用自定义的方法GiveMyFileInfo导入信息
}
for (int i = 0; i < dircounts; i++)
//此处对文件夹下面的子文件夹进行递归遍历,并且加入到列表中,因为都是合并数组的操作
//但是数组类型不一样,所以AddNewArray方法用了一个范型,呵呵
//这里的操作非常消耗资源啊。
{
AddNewArray<ClMyFile>(ref myfilelist, GetFilelist(filePath + "//" + ChildDirectory[i]));
}
//××××××××××××××××××××××××××××
//获得所选目录及其子目录下的所有文件
return myfilelist;
}