2010-01-26 66 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); 
    }