1

我正在寻找一种将文本文件添加到不枚举整个文件集的 SharePoint 列表的方法。根据这篇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

4

3 回答 3

1

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

于 2010-01-26T22:19:58.240 回答
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, "");
于 2010-01-27T06:56:02.343 回答
0

感谢天真的主义者。你提醒过我曾经看过一篇文章,它提出了同样的建议,但作为 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);
    }
于 2010-01-27T20:48:38.887 回答