本节中所阐述的内容,主要适用于SharePoint文档库中的文件和文件夹,以及列表中的文件夹。系统中的其他文件(如_layouts中的文件、配置文件、程序文件等)不在本章节的讨论范围之内。

 

(一)概述

SharePoint的文档库是文件系统和列表系统的双重结构:文档库中的文件既是一个文件也是一个列表条目;文档库和列表中的文件夹既是一个文件夹也是一个列表条目(普通列表和文档库的文件夹略微有些不同)。

那么,既然文档/文件夹/普通列表条目都可以用同样的列表条目的形式表现,那么如何区分一个列表条目究竟是一个条目/文件,还是一个文件夹呢?有两种方法(在后面会看到代码示例):

(1) 通过SPListItem的ContentType属性,根据条目的内容类型判断。在SharePoint 2007及2010中,文件夹是一种特殊的内容类型,凡是继承了文件夹内容类型的条目,都是以文件夹的形式存在的。

(2)通过SPListItem的FileSystemObjectType属性判断,该属性的类型是SPFileSystemObjectType枚举,如果值为Folder表示该条目是一个文件夹,如果值为File表示该条目是一个文件/普通条目。

 

(二)常用对象和操作

1、文件和文件夹的获取

文件和文件夹的获取主要有如下几种方式:

(1) 使用SPWeb的GetFile(string url)和GetFolder(string url)方法,根据文件/文件夹的相对网站或相对服务器地址获取到文件/文件夹对象。但需要注意的是,即使该Url中不存在任何文件或文件夹,同样可以获取到相应的SPFile或SPFolder对象,程序不会抛出任何异常。但是我们可以通过SPFile或SPFolder的Exists属性(bool类型)来判断这个文件或文件夹是否确实存在。

(2) 使用SPWeb的RootFolder属性或SPList的RootFolder属性获取网站或列表的根文件夹对象。

(3) 使用后文提到的交叉访问的方法,先获取到列表条目(SPListItem),再获取到与之对应的文件或文件夹。

(4)使用后文将要介绍的遍历方法。

 

2、文件系统和列表系统的交叉访问

既然SharePoint文件系统有双重性质,就必然会涉及到交叉访问的问题,也就是说当得到了一个文件/文件夹之后,如何得到与之对应的列表条目;以及得到了列表条目之后,如何得到与之对应的文件或文件夹。

这里首先要说明一下什么时候使用文件/文件夹,什么时候使用列表条目,换句话说,文件/文件夹与列表条目之间在使用上的本质区别在什么地方。文件中保存的是文件的内容、文件名称、文件大小、创建时间等一些文件固有属性;文件夹保存的是文件夹名称,文件夹中的文件和子文件夹(因此在涉及到查询或遍历范围的时候,总是直接使用SPFolder对象);列表条目保存的是除文件和文件夹固有属性之外的一些扩展属性。当然,文件和文件夹的一些固有属性同样存放在列表条目的一些字段中。

从实际开发应用概括地来说,如果需要获取一些属性、名称等内容,则使用列表条目;如果需要获得或修改文件内容,则使用文件;如果需要进行查询或遍历,则使用文件夹。

列表条目 → 文件系统的访问:当获取到一个列表条目之后,首先可以通过SPListItem的ContentType或FileSystemObjectType属性判断出该条目对应的是文件还是文件夹,之后通过SPListItem的File属性或Folder属性获取到相应的文件或文件夹对象。如果使用不当(比如对文件夹对应的条目使用了File属性),则相应的属性为null。

文件系统 列表条目的访问:当获取到文件或文件夹之后,判断他们是否有对应的列表条目稍微有些复杂。当获取到文件对象之后,通过SPFile的InDocumentLibrary属性(bool类型)可以判断文件是否在文档库中,但是这样无法区分出文档库中保存的文件和文档库中的一些视图、表单页面。当获取到文件夹对象后,通过SPFolder的ContainingDocumentLibrary属性(Guid类型),可以判断出文件夹是否包含在文档库中,但是这种方法也无法判断出普通列表中的文件夹。不过我们可以通过更直观的SPFile的Item属性(SPListItem类型)来进行判断,当获取一个SPFile或SPFolder对象的Item属性之后,会分成三种情况:(1)Item属性不为空,则表示此文件或文件夹对应的列表条目;(2)Item属性为空(null),则表示此文件或文件夹包含在列表或文档库中,但是不对应任何列表条目(可能是一些视图、表单页面或其他文件夹);(3)抛出信息为“指定的对象不属于列表”的异常,说明这个文件或文件夹不在列表或文档库中。

在后文的文档库/列表遍历中,我们会看到相应的例子。

 

3、文件的读取、上传和修改

文件的读取可以使用SPFile的OpenBinary()方法,返回文件内容的byte数组;对于比较大的文件,出于性能考虑,也可以使用SPFile的OpenBinaryStream()方法,返回相应的Stream文件流对象,再进行读取。对于文本文件,获取其内容有一个更方便的方法,就是使用SPWeb的GetFileAsString(string url)方法,直接得到文本文件的内容。

文件的上传与一般的集合操作相同,使用SPFileCollection的Add方法进行。Add方法有很多种重载,归纳起来大致分为两类:使用byte[]作为参数指定文件内容(适用与较小的文件);使用Stream作为参数指定文件流(适用于较大文件,或适合使用流格式的文件)。

通过下面的例子,展示了如何将文档库中的一个文件复制为同文件夹另一个文件(当然这里只是为了展示文件内容的操作,文件复制有一个更加直观的方法——使用SPFile的CopyTo方法):

   1: using(SPSite site = new SPSite("http://sp2010/book"))

   2: {

   3:   using(SPWeb web = site.OpenWeb())

   4:   {

   5:     SPFile sourceFile = web.GetFile("Chapters/Ch01.docx");

   6:     SPFolder folder = sourceFile.ParentFolder;

   7:     folder.Files.Add("Ch01_backup.docx", 

   8:                         sourceFile.OpenBinaryStream());

   9:   }

  10: }

文件的内容修改使用SPFile的SaveBinary方法,其重载的参数与文件上传类似:使用byte[]作为参数指定文件内容(适用与较小的文件);使用Stream作为参数指定文件流(适用于较大文件,或适合使用流格式的文件)。

SPFile对象的绝大部分属性都是只读的,甚至包括表示文件名的Name属性。因此,如果需要修改文件名的话,需要使用SPFile的MoveTo方法,如下面的例子所示:

   1: using(SPSite site = new SPSite("http://sp2010/book"))

   2: {

   3:   using(SPWeb web = site.OpenWeb())

   4:   {

   5:     SPFile file = web.GetFile("Chapters/Ch01.docx");

   6:     file.MoveTo(file.ParentFolder.Url + "/Ch01_New.docx");

   7:   }

   8: }

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

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

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

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

    本节将会介绍SharePoint中最为常用的一些对象模型,以及如何使用这些对象模型来访问和操作网站中的数据.几乎所有的SharePoint服务器端开发都会涉及到这些内容,因此应着重掌握本节中所介绍的基 ...

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

    (四)列表附件 列表的附件也是文件系统的一部分,它依附于普通列表的列表条目之上(文档库没有附件),它的操作在一些地方和文档库中文档的操作非常类似.   1.附件的读取 一个列表条目的附件可以使用SPL ...

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

    4.添加文件夹 文件夹的创建方法在文档库和普通列表中稍有不同. 在文档库中,与一般的集合操作相同,直接使用SPFolderCollection的Add(string name)方法即可添加文件夹,例如 ...

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

    (五)列表条目(SPListItem) SharePoint中数据的存储基本上都是通过列表条目来完成(文档库中的文档也是一种特殊的列表条目),因此在SharePoint应用开发中,最终是要和列表条目打 ...

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

    (一)概述 SharePoint权限系统是整个SharePoint体系中一个比较重要的部分,权限系统主要分成两大部分:认证和授权. 认证主要解决的问题是判断登陆者是否合法,以及他究竟是哪一个用户,Sh ...

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

    (二)列表(SPList) 列表是SharePoint中最为重要的数据容器,我们一般保存在SharePoint中的所有数据,都是保存在列表中(文档库也是一种列表),因此列表对象在SharePoint的 ...

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

    (三)视图 与传统意义上的数据视图类似,SharePoint中的列表视图指定了列表中数据的筛选条件.排序条件.分组条件.显示栏/字段.显示条目数.显示样式等内容.在SharePoint中,使用SPVi ...

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

    (四)栏/字段 SharePoint中的字段(中文版中叫做"栏")与传统的数据栏类似,也有不同类型的区别,不过SharePoint中内置的栏类型除了按照数据类型(如数字.日期和时间 ...

随机推荐

  1. 【FAQ】Ubuntu环境下ant编译android代码问题

    在Ubuntu14.04环境下,编译android程序时候,运行ant debug的时候出现如下异常:

  2. java 入门-helloWorld

    Java 教程 Java 是由Sun Microsystems公司于1995年5月推出的高级程序设计语言. Java可运行于多个平台,如Windows, Mac OS,及其他多种UNIX版本的系统. ...

  3. 使用Tornado实现Ajax请求

    Ajax,指的是网页异步刷新,一般的实现均为js代码向server发POST请求,然后将收到的结果返回在页面上.   这里我编写一个简单的页面,ajax.html <html> <h ...

  4. iOS 程序进入后台,包含用户上拉快捷菜单导致程序失去活跃的研究

    今日在使用某App时候,突然发现上拉菜单.程序视频扔在播放,咦!引起了我的兴趣. 首先,列出两个方法, 第一个方法是AppDelegate的代理.当程序进入后台时候调用 - (void)applica ...

  5. 【Java】Java_07 浮点型

    浮点型 类型 占用存储空间 表数范围 Float 4字节 -3.403E38~3.403E38 Double 8字节 -1.798E308~1.798E308 float类型又被称作单精度类型,尾数可 ...

  6. asp.net web系统开发浏览器和前端工具

    1. Firefox浏览器+firebug插件 下载安装Firefox浏览器后,在菜单-附加组件-扩展中,搜索firebug,下载长得像甲虫一样的安装. 在web调试中,直接点击右上角的虫子,即可调出 ...

  7. 深入理解Tomcat虚拟文件夹

        我们知道,Web站点中的内容(包含网页,图片,音频文件等)一般都存放在App的文件夹下.但随着站点内容的不断丰富,用户须要把不同层次的内容组织成站点的子文件夹. 我们通常的做法是在站点主文件夹 ...

  8. JavaScript的特殊函数

    1.匿名函数 onclick=function(){}就是匿名函数. 2.匿名函数的回调函数 <script> <span style="white-space:pre&q ...

  9. unity, windows: Unhandled Exception: System.UnauthorizedAccessException: Access to the path "XXX\Temp\Assembly-CSharp.dll.mdb" is denied

    的windows上使用unity,修改过脚本或inspector中的数值后运行编辑器报错: Unhandled Exception: System.UnauthorizedAccessExceptio ...

  10. Atitit.java jna  调用c  c++ dll的原理与实践  总结  v2  q27

    Atitit.java jna  调用c  c++ dll的原理与实践  总结  v2  q27 1. Jna简单介绍1 2. Jna范例halo owrld1 3. Jna概念2 3.1. (1)需 ...