本节中所阐述的内容,主要适用于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. hdu 5265 技巧题 O(nlogn)求n个数中两数相加取模的最大值

    pog loves szh II Time Limit: 4000/2000 MS (Java/Others)    Memory Limit: 65536/65536 K (Java/Others) ...

  2. Excel中如何将时间戳转为时间?

    Unix时间戳转换Excel时间? Excel中如何将时间戳转为时间? Excel默认不支持Unix格式时间戳,这在导入数据时十分不便.可以用以下公式将时间戳转换成Excel格式的时间: =(x+8* ...

  3. SpringBoot学习小结

    基于Spring,简化Spring应用开发的框架,整个Spring技术栈的大整合,J2EE开发的一站式解决方案 优点: 快速创建独立运行的Spring项目以及集成主流框架 使用嵌入式的Servlet容 ...

  4. Jpa调用存储过程及参数

    public List<Object> findAllEntityListBySearch(Long inputInfoId, int flag) throws Exception { L ...

  5. Eclipse安装Properties Editore插件

    Properties Editor for Eclipse3[1].0-3.2安装使用-http://jzgl-javaeye.iteye.com/blog/386010 PropertiesEdit ...

  6. Android.KungFu手机病毒原理及清理方法

    原文链接:http://jingyan.baidu.com/article/363872ec8ad56b6e4ba16fb1.html Android.KungFu手机病毒清理方法 浏览:3333 | ...

  7. rabbitmqctl 报错

    RabbitMQ 安装成功后,cmd dos命令进入RabbitMQ的安装路径,如 E:\Program Files\RabbitMQ Server\rabbitmq_server-3.6.10\sb ...

  8. Atitit.嵌入式web 服务器 java android最佳实践

    Atitit.嵌入式web 服务器 java android最佳实践 1. Android4.4.21 2. 自己的webserver1 3. CyberHTTP for Java  cybergar ...

  9. Mat::operator =

    Provides matrix assignment operators. C++: Mat& Mat::operator=(const Mat& m) C++: Mat& M ...

  10. Python内置函数之input()

    input([prompt])input()读取标准输入并打印字符串到屏幕. 参数是自定义的提示符. 例子: >>> input('$ ') $ pwd 'pwd'