SharePoint服务器端对象模型 之 访问文件和文件夹(Part 1)
本节中所阐述的内容,主要适用于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)的更多相关文章
- SharePoint服务器端对象模型 之 访问文件和文件夹(Part 3)
(三)遍历 文件系统的遍历是指按照文件夹的层级结构遍历文档库.列表的文件夹和列表条目.遍历主要有三种方式:(1)直接使用文件系统对象模型进行遍历:(2)使用SPDocumentLibrary进行遍历: ...
- SharePoint服务器端对象模型 之 访问网站和列表数据(Part 1)
本节将会介绍SharePoint中最为常用的一些对象模型,以及如何使用这些对象模型来访问和操作网站中的数据.几乎所有的SharePoint服务器端开发都会涉及到这些内容,因此应着重掌握本节中所介绍的基 ...
- SharePoint服务器端对象模型 之 访问文件和文件夹(Part 4)
(四)列表附件 列表的附件也是文件系统的一部分,它依附于普通列表的列表条目之上(文档库没有附件),它的操作在一些地方和文档库中文档的操作非常类似. 1.附件的读取 一个列表条目的附件可以使用SPL ...
- SharePoint服务器端对象模型 之 访问文件和文件夹(Part 2)
4.添加文件夹 文件夹的创建方法在文档库和普通列表中稍有不同. 在文档库中,与一般的集合操作相同,直接使用SPFolderCollection的Add(string name)方法即可添加文件夹,例如 ...
- SharePoint服务器端对象模型 之 访问网站和列表数据(Part 5)
(五)列表条目(SPListItem) SharePoint中数据的存储基本上都是通过列表条目来完成(文档库中的文档也是一种特殊的列表条目),因此在SharePoint应用开发中,最终是要和列表条目打 ...
- SharePoint服务器端对象模型 之 访问用户、用户组和权限(Part 1)
(一)概述 SharePoint权限系统是整个SharePoint体系中一个比较重要的部分,权限系统主要分成两大部分:认证和授权. 认证主要解决的问题是判断登陆者是否合法,以及他究竟是哪一个用户,Sh ...
- SharePoint服务器端对象模型 之 访问网站和列表数据(Part 2)
(二)列表(SPList) 列表是SharePoint中最为重要的数据容器,我们一般保存在SharePoint中的所有数据,都是保存在列表中(文档库也是一种列表),因此列表对象在SharePoint的 ...
- SharePoint服务器端对象模型 之 访问网站和列表数据(Part 3)
(三)视图 与传统意义上的数据视图类似,SharePoint中的列表视图指定了列表中数据的筛选条件.排序条件.分组条件.显示栏/字段.显示条目数.显示样式等内容.在SharePoint中,使用SPVi ...
- SharePoint服务器端对象模型 之 访问网站和列表数据(Part 4)
(四)栏/字段 SharePoint中的字段(中文版中叫做"栏")与传统的数据栏类似,也有不同类型的区别,不过SharePoint中内置的栏类型除了按照数据类型(如数字.日期和时间 ...
随机推荐
- 使用Unity3D的50个技巧:Unity3D最佳实践
转自:http://www.tuicool.com/articles/buMz63I 刚开始学习unity3d时间不长,在看各种资料.除了官方的手册以外,其他人的经验也是非常有益的.偶尔看到老外这篇 ...
- n皇后问题[分支限界法]
问题: 如何能够在 n×n 的国际象棋棋盘上放置八个皇后,使得任何一个皇后都无法直接吃掉其他的皇后?为了达到此目的,任两个皇后都不能处于同一条横行.纵行或斜线上. 分析: 我们可以用一串数字来表示问题 ...
- VLOOKUP多条件查找不使用辅助列
问题描述: 可能很多人在使用VLOOKUP的时候,对于多条件时,则会使用辅助列进行查找,那么不使用辅助列是否也可以呢? 答案是:必须可以. 问题处理: 1.使用辅助列 2.不使用辅助列的操作如下: 公 ...
- tomcat 输入localhost:8080显示404 (找不到tomcat主页)
最近使用tomcat时常出现一个问题,tomcat开启后浏览器输入localhost:8080时显示404,但是输入项目的路径是可以看到效果的,因为没啥大碍,所以没有在意 [ 在这里顺便介绍几种访问 ...
- linux socket读数据错误解释
EINTR 表示某种阻塞的操作,被接收到的信号中断,造成的一种错误返回值. EAGAIN 从字面上来看,是提示再试一次.这个错误经常出现在当应用程序进行一些非阻塞(non-blocking)操作( ...
- 解决window10系统电脑插入耳机之后没有声音的问题
其实办法也是从百度百科上查到的 ⁄(⁄ ⁄•⁄ω⁄•⁄ ⁄)⁄ 可能是因为自己某个不小心的操作更改了设置 1. 首先要点开设置按钮,在搜索栏输入控制面板 (当然知道控制面板在哪里的小伙伴就不用 ...
- 【设计模式 7】从公司的目前框架和API Gateway,谈谈对外观模式的理解
我,第一次用到外观模式,应该是3年多以前.那时候是做一个收费系统,在当时的U层和B层之间,加了一层Facade.当时,在一些复杂的业务逻辑处理时,感受到了加入外观层的好处,但对于一些简单的(我指的是, ...
- .net中数据缓存使用
今天 遇到一个问题 访问一个接口数据 基本上是固定的,于是想把数据 缓存下来...于是版本1 诞生了 private static ConcurrentDictionary<int, List& ...
- 自己动手制作更好用的markdown编辑器-02
这里文章都是从个人的github博客直接复制过来的,排版可能有点乱. 原始地址 http://benq.im 文章目录 1. 工具条 1.1. 样式 1.2. 工具条截图 2. 状态栏消息 3. 文件 ...
- 设计模式之代理模式(php实现)
github地址:https://github.com/ZQCard/design_pattern /** * 在代理模式中,我们创建具有现有对象的对象,以便向外界提供功能接口. * 1.Window ...