zoukankan      html  css  js  c++  java
  • SharePoint服务器端对象模型 之 访问文件和文件夹(Part 3)

    (三)遍历

    文件系统的遍历是指按照文件夹的层级结构遍历文档库、列表的文件夹和列表条目。遍历主要有三种方式:(1)直接使用文件系统对象模型进行遍历;(2)使用SPDocumentLibrary进行遍历;(3)借助SPQuery进行遍历。

    1、SPList的Items和Folders属性

    在介绍真正的遍历之前,有必要先解释一下这两个重要的属性。

    这两个属性返回的都是SPListItemCollection类型,它们分别返回了列表中所有的普通条目(或文件),以及列表中的所有文件夹。不论这些条目、文件、文件夹在列表的层次结构中处于什么位置,Items和Folders属性都会获得列表中的全部内容,而且是不分层次结构的。

    因此,实际上这两个属性的使用频率要比遍历操作高得多(尤其是Items属性)。当我们需要获取列表中的所有普通条目或者文件的时候(一般我们不太关心文件夹本身),就需要使用Items属性。这个属性的存在使得在操作文档库的时候,要比操作磁盘的文件系统方便得多——可以直接得到文档库中任意层次下的所有文件!

    顺便提一下,Items和Folders合在一起,就是列表中所存储的所有内容。在SharePoint的对象模型中,SPList有一个属性是ItemCount,返回列表中所存储的所有条目的数目,经常有人认为这个属性就是spList.Items.Count,其实不然。实际上,spList.ItemCount应该等于spList.Items.Count + spList.Folders.Count。

    2、使用文件系统对象模型进行遍历

    与.NET中传统的FileInfo/DirectoryInfo类似地,SPFile和SPFolder也有着明显的层级结构,通过使用SPFolder的Files(SPFileCollection类型)和SubFolders(SPFolderCollection类型)可以直接按照文件夹的层级结构使用foreach等方法进行递归遍历,在此不再做示例。

    这种方式的便利虽然直观而且简单,但是有两个不容忽视的问题:

    (1) 这种方式仅适用于文档库,普通列表虽然可以有Folder,但是没有File,无法直接进行遍历;

    (2) 使用这种方式遍历的时候,需要执行的帐号有“浏览目录”的权限(如图2-10);但是在SharePoint内置的权限级别中,只有“参与讨论”及以上的权限级别才包含这个权限,换句话说,对于网站的“读者”或“查看者”,是无法正常执行使用这种方式进行遍历的程序的。

    image

    3、使用SPDocumentLibrary进行遍历

    这种方法借助了SPList的一个专门针对文档库设计的子类:SPDocumentLibrary。虽然该方法同样只能应用于文档库,但是解决了直接使用文件系统对象模型遍历的第二个问题,即权限问题。

    SPDocumentLibrary作为SPList的子类,提供了一个特殊的方法,叫做GetItemsInFolder——顾名思义,是用于获取文档库的某个文件夹下的内容的。此外,SPDocumentLibrary还提供了另外一个比较有用的属性,IsCatalog(bool类型),用于判断一个文档库是否是网站的配置文档库(比如列表模板库、网站模板库、Web部件库、母版页库等)。使用SPDocumentLibrary进行文档库遍历的具体方法可以参看下面这个示例:

       1: static void GoThroughDocLib(SPDocumentLibrary doclib, 
       2:     SPFolder folder, int level)
       3: {
       4:   SPListItemCollection items =
       5:   doclib.GetItemsInFolder(doclib.DefaultView, folder);
       6:   if (items.Count == 0) return;
       7:  
       8:   foreach (SPListItem item in items)
       9:   {
      10:     for (int i = 0; i < level; i++) Console.Write("  ");
      11:     if (item.FileSystemObjectType == SPFileSystemObjectType.Folder)
      12:     {
      13:       Console.WriteLine("[{0}]", item.Name);
      14:       GoThroughDocLib(doclib, item.Folder, level + 1);
      15:     }
      16:     else
      17:       Console.WriteLine(item.File.Name);
      18:   }
      19: }
      20:  
      21: static void Main(string[] args)
      22: {
      23:   using(SPSite site = new SPSite("http://sp2010/book"))
      24:   {
      25:     using(SPWeb web = site.OpenWeb())
      26:     {
      27:       SPDocumentLibrary doclib = web.Lists["共享文档"] as SPDocumentLibrary;
      28:       GoThroughDocLib(doclib, doclib.RootFolder, 0);
      29:     }
      30:   }
      31: }

    在本示例程序中,就应用了交叉访问的方法,在区分了一个条目是文件还是文件夹之后,使用了SPListItem的File属性和Folder属性获取其文件对象和文件夹对象。实际上,item.File.Name和item.Name是一样的。

    4、使用SPQuery进行遍历

    上述方法解决了文件系统遍历的权限问题,但是仍然只是局限在文档库中。实际上,上面一种方法是SharePoint 2003时代遗留下来的方法,到了2007和2010时代,普通列表中也增加了文件夹的结构,因此也就衍生了新的遍历方法——借助SPQuery的遍历。

    SPQuery的主要作用是进行列表查询——从类名上就可以看出这一点。在查询的时候,可以通过其Folder属性指定查询范围的文件夹。通过这一特性,我们可以不指定任何查询条件,就相当于返回范围内的所有内容了。使用这种方法可以在所有的列表中进行遍历,自然也包括了文档库,下面是一个例子:

       1: static void GoThroughList(SPList list, SPFolder folder, int level)
       2: {
       3:   SPQuery query = new SPQuery();
       4:   query.Folder = folder;
       5:   SPListItemCollection items = list.GetItems(query);
       6:   if (items.Count == 0) return;
       7:  
       8:   foreach (SPListItem item in items)
       9:   {
      10:     for (int i = 0; i < level; i++) Console.Write("  ");
      11:     if (item.FileSystemObjectType == SPFileSystemObjectType.Folder)
      12:     {
      13:       Console.WriteLine("[{0}]", item.DisplayName);
      14:       GoThroughList(list, item.Folder, level + 1);
      15:     }
      16:     else
      17:       Console.WriteLine(item.DisplayName);
      18:   }
      19: }
      20:  
      21: static void Main(string[] args)
      22: {
      23:   using(SPSite site = new SPSite("http://sp2010/book"))
      24:   {
      25:     using(SPWeb web = site.OpenWeb())
      26:     {
      27:       SPList list = web.Lists["Chapters"];
      28:       GoThroughList(list, list.RootFolder, 0);
      29:     }
      30:   }
      31: }

    本程序大体结构与使用SPDocumentLibrary进行遍历的程序完全相同,只是使用的方法不同。关于SPQuery的使用,在后文还有更加详细的讲解。

  • 相关阅读:
    java封装
    本人的其他博客
    codeforces 1000C
    1005E1 Median on Segments (Permutations Edition) 【思维+无序数组求中位数】
    1009E Intercity Travelling 【数学期望】
    codeforces 1009D Relatively Prime Graph【欧拉函数】
    1077E Thematic Contests 【二分答案】
    codeforces 1077D Cutting Out 【二分】
    【非原创】ZOJ
    数字千万别用puts!
  • 原文地址:https://www.cnblogs.com/erucy/p/4234310.html
Copyright © 2011-2022 走看看