Перечисление SPList.Файлы - это плохо
-
22-09-2019 - |
Вопрос
Я ищу способ добавить текстовый файл в список 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.Файлы такие же, как SPList.Файлы, в данном случае (поскольку существует только корневая папка с текстовыми файлами), и если да, то есть ли способ добавить один файл без перечисления коллекции файлов?
Заранее благодарю.:D
Решение
На самом деле нет ничего плохого в вызове Files.Add.Простой доступ к элементу не приведет к перечислению коллекции.Если бы вы вызвали GetEnumerator() для него или использовали его в цикле foreach , это вызвало бы перечисление.
Другие советы
Боясь использовать 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, "");
Спасибо, наивные.Вы напомнили, что однажды я видел статью, в которой предлагалось то же самое, но в качестве метода расширения в 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);
}