C# 遍历文件夹问题

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了C# 遍历文件夹问题相关的知识,希望对你有一定的参考价值。

文件夹的结构如下:
A BB1,B2,B3 , CC1,C2,C3 , DD1,D2,D3
程序如下:
static void ShowDir(DirectoryInfo dir)

Console.WriteLine(dir.Name);

DirectoryInfo[] directories = dir.GetDirectories();

foreach (DirectoryInfo dirX in directories)

ShowDir(dirX);



static void Main(string[] args)

DirectoryInfo dir = new DirectoryInfo(@"d:\A");

ShowDir(dir);

Console.Read();

我不是很明白:
首先把A目录传给这个方法,然后输出A的名字,然后调用GetDirectories()方法返回A目录下的子目录

用foreach循环遍历这3个子目录,然后把第1个子目录B传给了ShowDir()方法,递归调用,输出B的名字

又返回B的子目录,然后又遍历B的子目录,把B1子目录又递归,最后B1子目录下没有目录,那返回不是空的给数组了吗,那最后不是不执行foeach循环了吗,为什么最后能把全部目录显示出来?

谁解释一下的工作步骤?
拜托,你给我这些代码干嘛
我琢句调试了一下,到B1的时候返回的是空,应该是不执行foreach循环退出这个函数的,可是为什么它又返回执行了ShowDir()这个方法呢?又把B2递归过去,郁闷啊

第二次的时候不是把A的子目录数组给覆盖了吗,不是变成存放的是B的子目录了吗?

首先,目录A的foreach方法执行时,得到三个目录B,C,D,在foreach到B目录时,调用了一个方法ShowDir(目录B),在这里目录A的Foreach还有C,D还没有循环到,在目录B的Foreach方法里,又有三个目录B1,B2,B3,在执行目录B的foreach时,执行了ShowDir(目录B1),还有B2,B3目录的方法ShowDir(B2),ShowDir(B3)还未执行,执行ShowDir(目录B1)时,里面没有子目录,所以返回,执行ShowDir(B2)方法,以此类推,当执行ShowDir(B3)返回时,B目录的Foreach执行完毕,接着执行目录A循环里的两个为执行Foreach的目录C,D
目录C和目录D的执行方式与目录B一致。这样就循环了所有目录。
参考技术A 12.枚举一个文件夹中的所有文件夹
//using System.IO;
foreach (string %%2 in Directory.GetDirectories(%%1))
%%3

/*
DirectoryInfo dir = new DirectoryInfo(%%1);
FileInfo[] files = dir.GetFiles("*.*");
foreach(FileInfo %%2 in files)
%%3

*/

13.复制文件夹
/*
using System.IO;
using System.Collections;
*/
string path = (%%2.LastIndexOf("\\") == %%2.Length - 1) ? %%2 : %%2+"\\";
string parent = Path.GetDirectoryName(%%1);
Directory.CreateDirectory(path + Path.GetFileName(%%1));
%%1 = (%%1.LastIndexOf("\\") == %%1.Length - 1) ? %%1 : %%1 + "\\";
DirectoryInfo dir = new DirectoryInfo(%%1);
FileSystemInfo[] fileArr = dir.GetFileSystemInfos();
Queue<FileSystemInfo> Folders = new Queue<FileSystemInfo>(dir.GetFileSystemInfos());
while (Folders.Count>0)

FileSystemInfo tmp = Folders.Dequeue();
FileInfo f = tmp as FileInfo;
if (f == null)

DirectoryInfo d = tmp as DirectoryInfo;
Directory.CreateDirectory(d.FullName.Replace((parent.LastIndexOf("\\") == parent.Length - 1) ? parent : parent + "\\", path));
foreach (FileSystemInfo fi in d.GetFileSystemInfos())

Folders.Enqueue(fi);


else

f.CopyTo(f.FullName.Replace(parent, path));



14.复制目录下所有的文件夹到另一个文件夹下
/*
using System.IO;
using System.Collections;
*/
DirectoryInfo d = new DirectoryInfo(%%1);
foreach (DirectoryInfo dirs in d.GetDirectories())

Queue<FileSystemInfo> al = new Queue<FileSystemInfo>(dirs.GetFileSystemInfos());
while (al.Count > 0)

FileSystemInfo temp = al.Dequeue();
FileInfo file = temp as FileInfo;
if (file == null)

DirectoryInfo directory = temp as DirectoryInfo;
Directory.CreateDirectory(path + directory.Name);
foreach (FileSystemInfo fsi in directory.GetFileSystemInfos())
al.Enqueue(fsi);

else
File.Copy(file.FullName, path + file.Name);



15.移动文件夹
/*
using System.IO;
using System.Collections;
*/
string filename = Path.GetFileName(%%1);
string path=(%%2.LastIndexOf("\\") == %%2.Length - 1) ? %%2 : %%2 + "\\";
if (Path.GetPathRoot(%%1) == Path.GetPathRoot(%%2))
Directory.Move(%%1, path + filename);
else

string parent = Path.GetDirectoryName(%%1);
Directory.CreateDirectory(path + Path.GetFileName(%%1));
%%1 = (%%1.LastIndexOf("\\") == %%1.Length - 1) ? %%1 : %%1 + "\\";
DirectoryInfo dir = new DirectoryInfo(%%1);
FileSystemInfo[] fileArr = dir.GetFileSystemInfos();
Queue<FileSystemInfo> Folders = new Queue<FileSystemInfo>(dir.GetFileSystemInfos());
while (Folders.Count > 0)

FileSystemInfo tmp = Folders.Dequeue();
FileInfo f = tmp as FileInfo;
if (f == null)

DirectoryInfo d = tmp as DirectoryInfo;
DirectoryInfo dpath = new DirectoryInfo(d.FullName.Replace((parent.LastIndexOf("\\") == parent.Length - 1) ? parent : parent + "\\", path));
dpath.Create();
foreach (FileSystemInfo fi in d.GetFileSystemInfos())

Folders.Enqueue(fi);


else

f.MoveTo(f.FullName.Replace(parent, path));


Directory.Delete(%%1, true);


16.移动目录下所有的文件夹到另一个目录下
//using System.IO;
//using System.Collections;
string filename = Path.GetFileName(%%1);
if (Path.GetPathRoot(%%1) == Path.GetPathRoot(%%2))
foreach (string dir in Directory.GetDirectories(%%1))
Directory.Move(dir, Path.Combine(%%2,filename));
else

foreach (string dir2 in Directory.GetDirectories(%%1))

string parent = Path.GetDirectoryName(dir2);
Directory.CreateDirectory(Path.Combine(%%2, Path.GetFileName(dir2)));
string dir = (dir2.LastIndexOf("\\") == dir2.Length - 1) ? dir2 : dir2 + "\\";
DirectoryInfo dirdir = new DirectoryInfo(dir);
FileSystemInfo[] fileArr = dirdir.GetFileSystemInfos();
Queue<FileSystemInfo> Folders = new Queue<FileSystemInfo>(dirdir.GetFileSystemInfos());
while (Folders.Count > 0)

FileSystemInfo tmp = Folders.Dequeue();
FileInfo f = tmp as FileInfo;
if (f == null)

DirectoryInfo d = tmp as DirectoryInfo;
DirectoryInfo dpath = new DirectoryInfo(d.FullName.Replace((parent.LastIndexOf("\\") == parent.Length - 1) ? parent : parent + "\\", %%2));
dpath.Create();
foreach (FileSystemInfo fi in d.GetFileSystemInfos())

Folders.Enqueue(fi);


else

f.MoveTo(f.FullName.Replace(parent, %%2));


dirdir.Delete(true);



17.以一个文件夹的框架在另一个目录创建文件夹和空文件
//using System.IO;
//using System.Collections;
bool b=false;//不创建空文件
string path = (%%2.LastIndexOf("\\") == %%2.Length - 1) ? %%2 : %%2 + "\\";
string parent = Path.GetDirectoryName(%%1);
Directory.CreateDirectory(path + Path.GetFileName(%%1));
%%1 = (%%1.LastIndexOf("\\") == %%1.Length - 1) ? %%1 : %%1 + "\\";
DirectoryInfo dir = new DirectoryInfo(%%1);
FileSystemInfo[] fileArr = dir.GetFileSystemInfos();
Queue<FileSystemInfo> Folders = new Queue<FileSystemInfo>(dir.GetFileSystemInfos());
while (Folders.Count > 0)

FileSystemInfo tmp = Folders.Dequeue();
FileInfo f = tmp as FileInfo;
if (f == null)

DirectoryInfo d = tmp as DirectoryInfo;
Directory.CreateDirectory(d.FullName.Replace((parent.LastIndexOf("\\") == parent.Length - 1) ? parent : parent + "\\", path));
foreach (FileSystemInfo fi in d.GetFileSystemInfos())

Folders.Enqueue(fi);


else

if(b) File.Create(f.FullName.Replace(parent, path));

参考技术B 你解释的不是挺对的嘛。就是这么工作的,B1没有子目录所以GetDirectories()返回空,所以就不再执行B1的foreach了,然后就返回刚才调用B1的函数,也就是显示B的函数的foreach(),进行下一项,也就是B2的显示。以此类推。B1 B2 B3都执行完了就返回A的foreach(),进行下一项,也就是C的显示。依此类推。这就是递归的本质。

C#遍历指定文件夹中所有文件的3种方法

    前段时间小编同事面试遇到了这个问题,由于同事比较菜并未很完美的完成这个问题,本文就替小编来解答一下。在C#中有多种方式类遍历指定文件夹中的文件,本文将介绍三种方式。

一、使用Directory类的GetFiles方法:

示例代码如下:

string[] files = Directory.GetFiles(folderPath, "*.*", SearchOption.AllDirectories);
foreach (string file in files)    // 处理每个文件

此方法简单易用,一行代码就可以完成遍历,适用于小型文件夹。但缺点是对于大型文件夹,GetFiles方法会遍历整个文件夹并返回一个包含所有文件的数组,可能导致性能问题。

二、使用DirectoryInfo类:

示例代码如下:

DirectoryInfo folder = new DirectoryInfo(folderPath);
foreach (FileInfo file in folder.GetFiles("*.*", SearchOption.AllDirectories))
   
 // 处理每个文件

//欢迎关注公众号“DOTNET开发跳槽”,关注可获得海量面试题

使用FileInfo对象来代表每个文件,可以获取更多文件属性,适用于大型文件夹。缺点是相比GetFiles方法略显冗长,不够简洁。

三、使用File类和Directory类的GetDirectories方法:

使用示例:

foreach (string directory in Directory.GetDirectories(folderPath, "*", SearchOption.AllDirectories))
  
  foreach (string file in Directory.GetFiles(directory))    
     
   // 处理每个文件    

这种方案是可以在遍历子文件夹时遍历指定深度,适用于想要完全控制遍历程度的情形。缺点是相比其他两种方法较为复杂,需要嵌套循环遍历。

结语:

    本文讲述了C#遍历指定文件夹中所有文件的3种方法,也替小编同事解决了疑问,以上三种遍历文件夹的方法各有优缺点,根据实际需求来选择使用哪种方法。如果只是遍历小型文件夹,可以选择GetFiles方法;如果需要遍历大型文件夹或获取更多文件属性,应该选择DirectoryInfo类;如果想要完全控制遍历程度,应该使用GetDirectories方法。希望本文对你有所收获,同时欢迎留言吐槽。

来源公众号:“dotnet开发跳槽”

以上是关于C# 遍历文件夹问题的主要内容,如果未能解决你的问题,请参考以下文章

c#怎么遍历文件夹下面的所有文件

C#,给定一个目录,遍历该目录下的所有文件、文件夹

C#如何遍历一个文件夹下面所有的文件

C#遍历指定文件夹中所有文件的3种方法

c#怎么遍历dictionary

C#遍历指定文件夹中的所有文件