2010-01-26 41 views
1

我正在尋找一種將文本文件添加到不列舉整個文件集的SharePoint列表的方法。根據this SharePoint最佳實踐文章,您不應該訪問SPList.Files屬性,因爲它枚舉了整個集合。除非你真的需要每件物品,否則它效率很低。我想要做的就是將一個文本文件添加到SharePoint列表的根文件夾中。到目前爲止,我使用了以下內容:枚舉SPList.Files不好

using (MemoryStream stream = new MemoryStream()) 
    { 
     StreamWriter writer = new StreamWriter(stream, Encoding.UTF8); 

     // write some stuff to the stream ... 
     // create a file-name-safe URL ... 
     // create a SPFileCollectionAddParameters object ... 

     // add the file 
     SPFile newFile = loggingList.RootFolder.Files.Add(fileURL, stream, addProperties); 

}

那麼,是枚舉SPList.RootFolder.Files一樣SPList.Files,在這種情況下(因爲只有用文字根文件夾文件),如果是這樣,是否有一種方法可以添加一個文件而不用枚舉文件集合?

在此先感謝。 :D

回答

1

實際上調用Files.Add沒有任何問題。簡單訪問該成員將不會枚舉該集合。如果您要調用GetEnumerator()或在foreach循環中使用它,則會觸發枚舉。

+0

乾杯隊友,但MSDN文章另有說明。我還讀過一篇文章,這篇文章是由曾使用dll反射器查看另一個類似的SharePoint對象屬性背後的代碼的人所使用的......它使用無限制的CAML查詢來查詢並返回每個項目,每次訪問該屬性時都會返回。 :\。可能是錯誤的。 – user246091 2010-01-26 22:27:20

+0

我剛剛檢查了反射器。實際上,每次訪問屬性時都會創建一個新的SPFileCollection,但不會開始枚舉它。 SPList.Items也是如此。 – Josh 2010-01-26 22:38:50

+0

甜。 :D。那麼新的收藏品是空的?我想它不會開始枚舉,直到您實際嘗試訪問列表中的元素。即集合的迭代器實際上執行數據庫訪問的東西,集合有方法將新項目推回到內容數據庫,添加到集合和調用更新....謝謝。我瘦了,回答它。 :D – user246091 2010-01-26 23:42:46

0

由於害怕使用SPList.Items(類似於SPList.Files,但在簡單的列表中使用,而不是文檔庫),我們創建了一個輔助函數返回一個空的集合,因此不是獲取服務器的所有項目:

public static SPListItemCollection CreateEmptyCollection(SPList List) 
{ 
    const string EmptyQuery = "0"; 
    SPQuery q = new SPQuery {Query = EmptyQuery}; 
    return List.GetItems(q); 
} 

然後,將項目添加到列表時,我們做這樣的:

ListItem = CreateEmptyCollection(someList).Add("/sites/somesite/lists/somelist/path/to/required/folder", SPFileSystemObjectType.File, ""); 
+0

阿哈......我知道我在某處看到過這個!我曾經發現和文章,建議同樣的事情,但使其成爲SPList擴展方法。我會添加一個帖子。乾杯兄弟。 – user246091 2010-01-27 20:47:05

0

感謝naivists。你已經提醒我曾經看到過一篇文章提出了同樣的問題,但是作爲SPList的擴展方法:

public static SPListItem AddItemOptimized(this SPList list, string folderUrl, 
     SPFileSystemObjectType underlyingObjectType, string leafName) 
    { 
     const string EmptyQuery = "0"; 
     SPQuery q = new SPQuery 
     { 
      Query = EmptyQuery 
     }; 
     return list.GetItems(q).Add(folderUrl, underlyingObjectType,leafName); 
    }