设为首页 收藏本站
查看: 606|回复: 0

[经验分享] SharePoint服务器端对象模型 之 访问文件和文件夹(Part 1)

[复制链接]
累计签到:4 天
连续签到:1 天
发表于 2015-9-26 11:47:21 | 显示全部楼层 |阅读模式
  本节中所阐述的内容,主要适用于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: }

运维网声明 1、欢迎大家加入本站运维交流群:群②:261659950 群⑤:202807635 群⑦870801961 群⑧679858003
2、本站所有主题由该帖子作者发表,该帖子作者与运维网享有帖子相关版权
3、所有作品的著作权均归原作者享有,请您和我们一样尊重他人的著作权等合法权益。如果您对作品感到满意,请购买正版
4、禁止制作、复制、发布和传播具有反动、淫秽、色情、暴力、凶杀等内容的信息,一经发现立即删除。若您因此触犯法律,一切后果自负,我们对此不承担任何责任
5、所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其内容的准确性、可靠性、正当性、安全性、合法性等负责,亦不承担任何法律责任
6、所有作品仅供您个人学习、研究或欣赏,不得用于商业或者其他用途,否则,一切后果均由您自己承担,我们对此不承担任何法律责任
7、如涉及侵犯版权等问题,请您及时通知我们,我们将立即采取措施予以解决
8、联系人Email:admin@iyunv.com 网址:www.yunweiku.com

所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其承担任何法律责任,如涉及侵犯版权等问题,请您及时通知我们,我们将立即处理,联系人Email:kefu@iyunv.com,QQ:1061981298 本贴地址:https://www.yunweiku.com/thread-119057-1-1.html 上篇帖子: SharePoint Learning Kit核心内容概述(一) 下篇帖子: SharePoint WebPart:扩展SharePoint 2007中图片展示功能
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

扫码加入运维网微信交流群X

扫码加入运维网微信交流群

扫描二维码加入运维网微信交流群,最新一手资源尽在官方微信交流群!快快加入我们吧...

扫描微信二维码查看详情

客服E-mail:kefu@iyunv.com 客服QQ:1061981298


QQ群⑦:运维网交流群⑦ QQ群⑧:运维网交流群⑧ k8s群:运维网kubernetes交流群


提醒:禁止发布任何违反国家法律、法规的言论与图片等内容;本站内容均来自个人观点与网络等信息,非本站认同之观点.


本站大部分资源是网友从网上搜集分享而来,其版权均归原作者及其网站所有,我们尊重他人的合法权益,如有内容侵犯您的合法权益,请及时与我们联系进行核实删除!



合作伙伴: 青云cloud

快速回复 返回顶部 返回列表