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
属性 提取文件。
顺便说一句 - 您不需要加载列表和根文件夹。您应该只加载您将要阅读的事物属性,即要获取列表项,您只需加载项目集合,无需加载整个列表。
我正在研究一种方法,该方法需要获取指定文件夹名称下的所有文件,并可选择包含所有子文件夹(递归)。我目前有以下适用于父文件夹文件的代码:
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
属性 提取文件。
顺便说一句 - 您不需要加载列表和根文件夹。您应该只加载您将要阅读的事物属性,即要获取列表项,您只需加载项目集合,无需加载整个列表。