【转】3.1SharePoint服务器端对象模型 之 访问文件和文件夹(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: }總結
以上是生活随笔為你收集整理的【转】3.1SharePoint服务器端对象模型 之 访问文件和文件夹(Part 1)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Linq找不到行或行已更改
- 下一篇: 浦发淘票票信用卡怎么返电影票