CSOM 按指定文件夹名称递归获取所有文件

CSOM Get all files recursively by specified folder name

我正在研究一种方法,该方法需要获取指定文件夹名称下的所有文件,并可选择包含所有子文件夹(递归)。我目前有以下适用于父文件夹文件的代码:

            using (var spClientContext = new AuthenticationManager().GetACSAppOnlyContext(siteUrl, _clientId, _clientSecret))
            {
                if (spClientContext != null)
                {
                    List list = spClientContext.Web.Lists.GetByTitle("Documents");
                    spClientContext.Load(list);
                    spClientContext.Load(list.RootFolder);
                    spClientContext.Load(list.RootFolder.Folders);
                    spClientContext.ExecuteQuery();
                    FolderCollection fcol = list.RootFolder.Folders;

                    if (fcol != null)
                    {
                        foreach (Folder f in fcol)
                        {
                            if (f.Name.Equals(folderName, StringComparison.InvariantCultureIgnoreCase))
                            {
                                spClientContext.Load(f.Files,
                                        items => items.Include(
                                        item => item.Name,
                                        item => item.Author,
                                        item => item.ModifiedBy,
                                        item => item.ListItemAllFields["Created"],
                                        item => item.ListItemAllFields["Modified"],
                                        item => item.ListItemAllFields["FileRef"],
                                        item => item.Length)
                                    );

                                spClientContext.ExecuteQuery();

                                FileCollection fileCol = f.Files;

                                foreach (File file in fileCol)
                                {
                                    // do stuff 
                                }
                            }
                        }
                    }
                }
            };

将文件包含在所有子文件夹中的最佳方法是什么?同样好奇,这里使用CAML查询会不会更好?我最终也需要优化排序,但不确定是否只能通过 CAML 查询来实现?提前致谢!

在那里使用 CamlQuery 实际上会更好 - 您可以在那里指定 RecursiveAll 范围,它将自动包含给定位置下的所有项目和文件夹。所以你可能想做这样的事情:

var camlQuery = CamlQuery.CreateAllItemsQuery();
var list = spClientContext.Web.Lists.GetByTitle("Documents");
var items = list.GetItems(camlQuery);
spClientContext.Load(items);

然后,对于每个项目,您可以使用项目上的 File 属性 提取文件。

顺便说一句 - 您不需要加载列表和根文件夹。您应该只加载您将要阅读的事物属性,即要获取列表项,您只需加载项目集合,无需加载整个列表。