【问题标题】:How to detect when a Sharepoint file is in a subfolder如何检测 Sharepoint 文件何时位于子文件夹中
【发布时间】:2016-09-01 01:43:52
【问题描述】:

我正在我的网页上显示来自 Sharepoint 2010 文档库的文件。我成功地显示了文件及其图标的列表。但是,有些文件位于子文件夹中,我不想显示文件图标,而是显示文件夹图标。

如何检测文件何时位于子文件夹中?

我可以解析每个文件的 ServerRelativeUrl 以确定文件夹结构。我希望有另一种方法。


这里是 Sharepoint 库:


这是生成该库中文件列表的代码:

using (ClientContext clientContext = new ClientContext(SharepointSite))
    {
        var query = new CamlQuery
        {
            ViewXml = "<View Scope='RecursiveAll'>" +
                        "<Query>" +
                         "<Where>" +
                            "<Eq>" +
                               "<FieldRef Name='FSObjType' />" +
                               "<Value Type='Integer'>0</Value>" +
                            "</Eq>" +
                         "</Where>" +
                        "</Query>" +
                      "</View>"
        };

        var sourceList = clientContext.Web.Lists.GetByTitle("Test Library");
        var files = sourceList.GetItems(query);
        clientContext.Load(files);
        clientContext.ExecuteQuery();
        foreach (var file in files)
        {
            var id = file.Id;
            var filename = file["FileLeafRef"].ToString();
            var iconName = clientContext.Web.MapToIcon(filename, string.Empty, IconSize.Size16);
            clientContext.ExecuteQuery();
            var imgUrl = "http://sharepointsite/_layouts/images/" + iconName.Value;
            Image iconImage = new Image {ImageUrl = imgUrl};

            clientContext.Load(file.ParentList);
            clientContext.ExecuteQuery();
            var listUrl = file.ParentList.DefaultDisplayFormUrl;
            HyperLink docLink = new HyperLink
            {
                Text = filename,
                NavigateUrl = listUrl + "?ID=" + id //ToDo:  fix
            };

            HtmlTableRow row = new HtmlTableRow();
            HtmlTableCell cell1 = new HtmlTableCell();
            cell1.Controls.Add(iconImage);
            HtmlTableCell cell2 = new HtmlTableCell();
            cell2.Controls.Add(docLink);
            row.Cells.Add(cell1);
            row.Cells.Add(cell2);
            tbFiles.Rows.Add(row);
        }
    }

导致:

只有列表中的第一个文件实际上在最顶层的库中。其余的在“测试文件夹”中。

【问题讨论】:

    标签: c# sharepoint


    【解决方案1】:

    了解 CAML 查询的 view scope 属性的可用选项可能会有所帮助:

    • 默认:从特定文件夹获取文件和子文件夹
    • RecursiveAll:从所有文件夹中获取文件和子文件夹
    • FilesOnly:仅获取特定文件夹中的文件(无文件夹)
    • 递归:只获取所有文件夹中的文件(无文件夹)

    如果要保持分层文件夹结构,有两种选择:

    1. 获取库中的所有文件(使用 RecursiveRecursiveAll 的视图范围)并尝试通过对结果进行后处理来自己重建文件结构
    2. 一次只获取一个文件夹中的文件和文件夹(使用默认的视图范围),只要您想深入了解子文件夹的内容,就执行新查询

    这两种方法同样有效,但总的来说我推荐第二种方法。它们都有缺点:第一个需要更大的前期网络请求和更多的后处理逻辑来组装层次结构,而第二个需要多个网络请求来检索所有数据。

    如果采用第二种方法,您可以通过将 CamlQuery 的 FolderServerRelativeUrl 属性设置为所需文件夹的 URL 来将 CAML 查询限制到特定文件夹。在处理从特定文件夹检索到的项目时,您可以检查它们的FileSystemObjectType 属性以确定它们是文件还是文件夹;如果它们是文件夹,您可以访问其Folder 属性以获取关联的folder object,您可以从中获取ServerRelativeUrl 属性以在您的下一个查询中使用以从该文件夹中获取项目。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-12-31
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多