枚举SPList.Files很糟糕

时间:2010-01-26 22:12:34

标签: sharepoint sharepoint-2010

我正在寻找一种方法将文本文件添加到不列举整个文件集的SharePoint列表中。根据{{​​3}} SharePoint最佳做法文章,您不应访问SPList.Files属性,因为它枚举整个集合。除非你真的想要每件物品,否则效率非常低。我想要做的就是将单个文本文件添加到SharePoint列表的根文件夹中。到目前为止,我正在使用以下内容:

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

3 个答案:

答案 0 :(得分:1)

实际上调用Files.Add并没有错。只需访问该成员就不会枚举该集合。如果您在其上调用GetEnumerator()或在foreach循环中使用它,则会触发枚举。

答案 1 :(得分: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, "");

答案 2 :(得分: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);
    }