如何在枚举文档库时排除隐藏/系统共享点文件

本文关键字:隐藏 系统 共享 文件 排除 枚举 文档 | 更新日期: 2023-09-27 18:34:06

我正在尝试枚举 SharePoint 文档库中的所有文件,但我想排除表单和文档模板等内容,以及通常不会显示在 AllItems 视图上的任何其他意外项目。

使用资源管理器视图时,它们显示为隐藏文件或文件夹,因此我希望能够以某种方式忽略它们。

    IEnumerable<SPFile> GetAllSubContent(SPFolder spFolder)
    {
        foreach (SPFile spFile in spFolder.Files)
        {
            yield return spFile;
        }
        foreach (SPFolder spSubFolder in spFolder.SubFolders)
        {
            foreach (SPFile spFile in GetAllSubContent(spSubFolder))
            {
                yield return spFile;
            }
        }
    }

如何在枚举文档库时排除隐藏/系统共享点文件

如何使用 SharePoint OM 排除系统文件

选项 1

使用 SPFile.Item 属性排除系统文件(不属于文档库的文件(:

var isSystemFile = (file.Item == null);

例:

IEnumerable<SPFile> GetAllSubContent(SPFolder spFolder)
{
    foreach (SPFile spFile in spFolder.Files.Cast<SPFile>().Where(f => f.Item != null))
    {
       yield return spFile;
    }
    foreach (SPFolder spSubFolder in spFolder.SubFolders)
    {
        foreach (SPFile spFile in GetAllSubContent(spSubFolder))
        {
           yield return spFile;
        }
    }
}

选项 2

使用 CAML 查询:

IEnumerable<SPFile> GetFiles(SPList list, SPFolder folder)
{
    var query = new SPQuery {Folder = folder, ViewAttributes = "Scope='"Recursive'""};
    var items = list.GetItems(query);
    return from SPListItem item in items select item.File;
}

用法:

var list = web.Lists.TryGetList("Assets");
var files = GetFiles(list, list.RootFolder);
foreach (var file in files)
{
      Console.WriteLine(file.Name);
} 

要排除隐藏文件,您可以对文件列表执行 linq 查询并过滤掉任何已设置FileAtttributes.Hidden文件,例如:

 IEnumerable<SPFile> GetAllSubContent(SPFolder spFolder)
    {
        var filteredFileList= spFolder.Files.Select(x => x).Where(x => (x.Attributes & FileAttributes.Hidden) == 0);
        foreach (SPFile spFile in filteredFileList)
        {
            yield return spFile;
        }
    }

如果要排除某些文件类型,可以使用以下命令:

var filteredFileList = Directory.GetFiles(spFolder).Where(name => !name.EndsWith(".exe")); ''or whatever extension you want to exclude