递归搜索文件/文件夹结构
我正在尝试为返回文件和文件夹列表的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循环,但是如果删除第一个项目,则必须记住减少索引器变量。
上述就是C#学习教程:递归搜索文件/文件夹结构分享的全部内容,如果对大家有所用处且需要了解更多关于C#学习教程,希望大家多多关注—计算机技术网(www.ctvol.com)!
本文来自网络收集,不代表计算机技术网立场,如涉及侵权请联系管理员删除。
ctvol管理联系方式QQ:251552304
本文章地址:https://www.ctvol.com/cdevelopment/936642.html