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内置的权限级别中,只有“参与讨论”及以上的权限级别才包含这个权限,换句话说,对于网站的“读者”或“查看者”,是无法正常执行使用这种方式进行遍历的程序的。

 

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的使用,在后文还有更加详细的讲解。

时间: 2024-11-16 18:40:20

SharePoint服务器端对象模型 之 访问文件和文件夹(Part 3)的相关文章

SharePoint服务器端对象模型 之 访问文件和文件夹(Part 4)

(四)列表附件 列表的附件也是文件系统的一部分,它依附于普通列表的列表条目之上(文档库没有附件),它的操作在一些地方和文档库中文档的操作非常类似.   1.附件的读取 一个列表条目的附件可以使用SPListItem的Attachments属性访问,该属性是SPAttachmentCollection类型.这个类型在SharePoint中是一个比较特殊的类型,其特殊之处在于不存在SPAttachment类型.那么SPAttachmentCollection这个集合中存放的又是什么呢?是附件的文件名

SharePoint服务器端对象模型 之 访问文件和文件夹(Part 2)

4.添加文件夹 文件夹的创建方法在文档库和普通列表中稍有不同. 在文档库中,与一般的集合操作相同,直接使用SPFolderCollection的Add(string name)方法即可添加文件夹,例如下面的程序在文档库的根目录中添加一个名为"技术文档"的子文件夹: 1: using(SPSite site = new SPSite("http://sp2010/book")) 2: { 3: using(SPWeb web = site.OpenWeb()) 4:

SharePoint服务器端对象模型 之 访问网站和列表数据(Part 5)

(五)列表条目(SPListItem) SharePoint中数据的存储基本上都是通过列表条目来完成(文档库中的文档也是一种特殊的列表条目),因此在SharePoint应用开发中,最终是要和列表条目打交道的.在SharePoint对象模型中,使用SPListItem表示列表条目,使用SPListItemCollection表示列表条目集合.   1.列表条目的获取 列表条目的获取有多种方式,一些常用方式如下: (1) 通过SPList的Items属性,获取列表中的所有条目(不包括文件夹本身对应的

SharePoint服务器端对象模型 之 访问用户、用户组和权限(Part 1)

(一)概述 SharePoint权限系统是整个SharePoint体系中一个比较重要的部分,权限系统主要分成两大部分:认证和授权. 认证主要解决的问题是判断登陆者是否合法,以及他究竟是哪一个用户,SharePoint与此相关的对象包括用户和用户组.SharePoint支持多种身份认证方式,从最基本的Windows集成认证到各种表单认证,并且在SharePoint 2010中增加了基于声明(Claim Based)认证方式,以及一些相关服务,允许在同一个网站中使用多种认证方式.不过认证方式的设置不

SharePoint服务器端对象模型 之 访问网站和列表数据(Part 2)

(二)列表(SPList) 列表是SharePoint中最为重要的数据容器,我们一般保存在SharePoint中的所有数据,都是保存在列表中(文档库也是一种列表),因此列表对象在SharePoint的开发中是非常重要的对象之一.在SharePoint中,列表对象使用SPList表示,列表的集合使用SPListCollection表示. 如果实在难以理解SharePoint列表是怎么一回事的话,可以设想如下这种其实不准确的比喻,与传统的数据类型相比较,有如下的对应关系:列表(SPList)相当于数

SharePoint服务器端对象模型 之 访问网站和列表数据(Part 3)

(三)视图 与传统意义上的数据视图类似,SharePoint中的列表视图指定了列表中数据的筛选条件.排序条件.分组条件.显示栏/字段.显示条目数.显示样式等内容.在SharePoint中,使用SPView表示列表视图,使用SPViewCollection表示视图的集合. 在SharePoint中,作为列表.文档库最主要的显示途径,每一个视图都对应有一个Url(即该视图所在页面的地址).事实上,当我们向页面中插入一个Web部件选择"列表和库"分类,或者直接选择插入一个"现有列表

SharePoint服务器端对象模型 之 访问网站和列表数据(Part 4)

(四)栏/字段 SharePoint中的字段(中文版中叫做"栏")与传统的数据栏类似,也有不同类型的区别,不过SharePoint中内置的栏类型除了按照数据类型(如数字.日期和时间等)进行区分之外,更多的是从应用类型(货币.选项.查阅项等)进行分类.除内置的字段类型之外,SharePoint同样允许我们通过开发的方式实现自定义字段类型的扩展.在SharePoint中使用SPField表示字段,使用SPFieldCollection表示字段集合,内置的字段类型使用SPFieldType枚

SharePoint服务器端对象模型 之 对象模型概述(Part 2)

(三)Url 作为一个B/S体系,在SharePoint的属性.方法参数和返回值中,大量的涉及到了Url,总的来说,涉及到的Url可以分为如下四类: 绝对路径:完整的Url,包含了协议头(http或https).端口号.主机名等等,例如:http://myserver/subweb/documents/myfolder/myfile.doc.在SharePoint中,必须要使用绝对路径的机会并不是很多.一些网站级别对象的属性为绝对路径,例如spWeb.Url和spSite.Url. 相对服务器路

开启貌似已经过时很久的新坑:SharePoint服务器端对象模型

5年前(嗯,是5年前),SharePoint 2010刚发布的时候,曾经和kaneboy试图一起写一本关于SharePoint 2010开发的书,名字叫<SharePoint 2010 应用开发指南>(涂指南这个名字不是白叫的).给大家看一下当年列出来的大纲: SharePoint 2010开发概览 SharePoint 2010基础架构,SharePoint与ASP.NET.IIS的关系 解释服务器场的概念,从硬件拓扑层次解释APP.WFE 解释Web应用程序.网站集.网站.列表和文档库的概