我正在寻找一种方法将文本文件添加到不列举整个文件集的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
答案 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);
}