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

时间:2014-12-11 17:36:32

标签: c# sharepoint-2010

我正在尝试枚举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;
            }
        }
    }

2 个答案:

答案 0 :(得分:1)

要排除隐藏文件,您可以对文件列表执行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

答案 1 :(得分:1)

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

选项1

使用SPFile.Item Property排除系统文件(那些不属于文档库的文件):

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);
}