我正在尝试为返回文件和文件夹列表的Web服务构建递归搜索功能。我创建了两个方法,因此它们充当递归搜索,首先获取顶级内容,然后将任何文件添加到fileList,将任何子文件夹添加到subFoldersList。我们传入访问级别(在我们的例子中为root),然后传递您想要信息的路径。如果找到任何文件夹,则删除顶部文件夹,因为它已开始搜索该文件夹。然后它调用processDirectories方法,该方法将getFiles传递给重新启动进程的新路径位置。现在测试我的文件夹结构如下。当它将第二个文件(profilepic.png)添加到列表中时。我收到错误“集合已被修改;枚举操作可能无法执行”。导致此错误的原因是什么?
Photos
picture1.png
TestFolder
profilepic.png
我的代码:
public static List<string> fileList = new List<string>();
public static List<string> subFolderList = new List<string>();
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);
}
}
答案 0 :(得分:4)
假设您没有将此作为学术练习,您可以使用Directory.EnumerateFiles并避免自己实施。
foreach(var png in Directory.EnumerateFiles(sourceDirectory, "*.png", SearchOption.AllDirectories))
{
// do something with the png file
}
答案 1 :(得分:2)
改变:
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循环更简单。
答案 2 :(得分:1)
问题出在这里
foreach (var subFolder in subFolderList)
{
subFolderList.RemoveAt(0);
processDirectories(root, subFolder);
}
您正在迭代subFilderList
,并且您正在同时从中移除项目。机器不知道如何处理。
在这种情况下,我建议的可能是定期for
- 循环
答案 3 :(得分:1)
试试这个,
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 );
}
}
答案 4 :(得分:0)
您无法检查集合并对其进行修改,如错误消息所示。例如,较低的foreach正在迭代subFolderList,然后删除第一个项目。之后,迭代器无效。
如果要修改集合,则应该使用for循环,但如果删除第一个项目等,则必须记住减少索引器变量。