3

我正在尝试为返回文件和文件夹列表的 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);
        }

    }
4

5 回答 5

4

假设您不是将其编写为学术练习,则可以使用Directory.EnumerateFiles并避免自己实现。

foreach(var png in Directory.EnumerateFiles(sourceDirectory, "*.png", SearchOption.AllDirectories))
{
   // do something with the png file
}
于 2012-11-08T17:31:35.877 回答
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);
}

一个集合在迭代时不能被修改,所以当你在迭代中对它进行 foreach 并从中删除项目时,它会引起麻烦。解决方法通常是使用 for 循环并适当地操作循环变量,但在您的情况下,while 循环更简单。

于 2012-11-08T17:31:49.963 回答
1

问题就在这里

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

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

在这种情况下,我的建议可能是做一个常规的for循环

于 2012-11-08T17:31:19.013 回答
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 ); 
    }
}
于 2012-11-08T17:31:57.490 回答
0

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

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

于 2012-11-08T17:32:59.430 回答