日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

【转】3.1SharePoint服务器端对象模型 之 访问文件和文件夹(Part 1)

發布時間:2023/12/10 编程问答 35 豆豆
生活随笔 收集整理的這篇文章主要介紹了 【转】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)的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。