C# 如何检测Sharepoint文件何时位于子文件夹中

C# 如何检测Sharepoint文件何时位于子文件夹中,c#,sharepoint,C#,Sharepoint,我正在网页上显示Sharepoint 2010文档库中的文件。我正在成功地显示文件及其图标的列表。但是,有些文件位于子文件夹中,我不想显示文件图标,而是想显示文件夹图标 如何检测文件是否位于子文件夹中? 我可以解析每个文件的ServerRelativeUrl以确定文件夹结构。我希望还有别的办法 以下是Sharepoint库: using (ClientContext clientContext = new ClientContext(SharepointSite)) {

我正在网页上显示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);
        }
    }


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

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);
        }
    }
使用(ClientContext=newclientcontext(SharepointSite))
{
var query=新的CamlQuery
{
ViewXml=“”+
"" +
"" +
"" +
"" +
"0" +
"" +
"" +
"" +
""
};
var sourceList=clientContext.Web.Lists.GetByTitle(“测试库”);
var files=sourceList.GetItems(查询);
加载(文件);
clientContext.ExecuteQuery();
foreach(文件中的var文件)
{
var id=file.id;
var filename=file[“FileLeafRef”].ToString();
var iconName=clientContext.Web.MapToIcon(文件名,string.Empty,IconSize.Size16);
clientContext.ExecuteQuery();
变量imgUrl=”http://sharepointsite/_layouts/images/“+iconName.Value;
图像iconImage=新图像{ImageUrl=imgUrl};
Load(file.ParentList);
clientContext.ExecuteQuery();
var listUrl=file.ParentList.DefaultDisplayFormUrl;
HyperLink docLink=新建超链接
{
Text=文件名,
NavigateUrl=listUrl+“?ID=“+ID//ToDo:修复
};
HtmlTableRow行=新的HtmlTableRow();
HtmlTableCell cell1=新的HtmlTableCell();
cell1.Controls.Add(iconImage);
HtmlTableCell cell2=新的HtmlTableCell();
cell2.Controls.Add(docLink);
row.Cells.Add(cell1);
行。单元格。添加(单元格2);
tbFiles.Rows.Add(行);
}
}

其结果是:


实际上,只有列表中的第一个文件位于最顶端的库中。其余部分在“测试文件夹”中。

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

  • 默认值:从特定文件夹获取文件和子文件夹
  • RecursiveAll:从所有文件夹中获取文件和子文件夹
  • FilesOnly:仅从特定文件夹获取文件(无文件夹)
  • 递归:仅从所有文件夹中获取文件(无文件夹)
如果要维护分层文件夹结构,有两个选项:

  • 获取库中的所有文件(使用RecursiveRecursiveAll的视图范围),并通过对结果进行后处理,尝试自己重建文件结构
  • 一次只能从一个文件夹中获取文件和文件夹(使用默认的视图范围),在需要深入查看子文件夹内容时执行新查询
  • 这两种方法同样有效,但总的来说,我推荐第二种。它们都有各自的缺点:第一种需要更大的前端网络请求和更多的后处理逻辑来组装层次结构,而第二种需要多个网络请求来检索所有数据

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