递归搜索文件/文件夹结构

我正在尝试为返回文件和文件夹列表的Web服务构建递归搜索function。 我创建了两个方法,因此它们充当递归搜索,首先获取顶级内容,然后将任何文件添加到fileList,将任何子文件夹添加到subFoldersList。 我们传入访问级别(在我们的例子中为root),然后传递您想要信息的路径。 如果找到任何文件夹,则删除顶部文件夹,因为它已开始搜索该文件夹。 然后它调用processDirectories方法,该方法将getFiles传递回新的路径位置,重新开始该过程。 现在用于测试我的文件夹结构如下。 当它将第二个文件(profilepic.png)添加到列表中时。 我收到错误“集合已被修改;枚举操作可能无法执行”。 导致此错误的原因是什么?

Photos picture1.png TestFolder profilepic.png 

我的代码:

  public static List fileList = new List(); public static List subFolderList = new List(); static void processDirectories(string access, string Folder) { getFiles(access, Folder); } static void getFiles(string access, string Folder) { var accessToken = new OAuthToken(token, secret); var api = new DssAPI(ConsumerKey, ConsumerSecret, accessToken); var folder = api.GetContents(access, Folder);//Get list from WebService foreach (var item in folder.Contents)//Contents is an IEnumerable { if (item.IsDirectory == true) subFolderList.Add(item.Path); else fileList.Add(item.Path); } foreach (var subFolder in subFolderList) { subFolderList.RemoveAt(0); processDirectories(root, subFolder); } } 

改变一点:

 foreach (var subFolder in subFolderList) { subFolderList.RemoveAt(0); processDirectories(root, subFolder); } 

至:

 while (subFolderList.Count > 0) { var subFolder = subFolderList[0]; subFolderList.RemoveAt(0); processDirectories(root, subFolder); } 

迭代时无法修改集合,因此当您在迭代中对其进行预处理并从中删除项时,会导致问题。 解决方法通常是使用for循环并适当地操作循环变量,但在你的情况下,while循环更简单。

假设您没有将此作为学术练习,您可以使用Directory.EnumerateFiles并避免自己实现。

 foreach(var png in Directory.EnumerateFiles(sourceDirectory, "*.png", SearchOption.AllDirectories)) { // do something with the png file } 

问题出在这里

  foreach (var subFolder in subFolderList) { subFolderList.RemoveAt(0); processDirectories(root, subFolder); } 

您正在迭代subFilderList ,并且您正在同时从中删除项目。 机器不知道如何处理。

在这种情况下,我建议可能会做一个常规的for -loop

试试这个,

 Public static void GetFilesLocal( string path) { foreach (string f in Directory.GetFiles( path)) { // Add to subFolderList. } foreach (string d in Directory.GetDirectories( path)) { GetFilesLocal( d ); } } 

您无法检查集合并对其进行修改,如错误消息所示。 例如,较低的foreach正在迭代subFolderList,然后删除第一个项目。 之后,迭代器无效。

如果要修改集合,则应该使用for循环,但是如果删除第一个项目,则必须记住减少索引器变量。