2010-01-26 13 views
1

Je suis à la recherche d'un moyen d'ajouter un fichier texte à une liste SharePoint qui n'énumère pas l'ensemble du fichier. Selon this article de meilleures pratiques SharePoint, vous ne devez pas accéder à la propriété SPList.Files car il énumère la collection entière. Sauf si vous voulez vraiment tous les articles, alors c'est très inefficace. Tout ce que je veux faire est d'ajouter un seul fichier texte dans le dossier racine d'une liste SharePoint. Jusqu'à présent, je me sers de ce qui suit:Énumérer SPList.Files est mauvais

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); 

}

Alors, est-SPList.RootFolder.Files même énumération que SPList.Files, dans ce cas (car il n'y a qu'un dossier racine avec le texte fichiers) et si oui, existe-t-il un moyen d'ajouter un seul fichier sans énumérer la collection de fichiers?

Merci d'avance. : D

Répondre

1

En fait, il n'y a rien de mal à appeler Files.Add. Simplement accéder au membre n'énumera pas la collection. Si vous deviez appeler GetEnumerator() ou l'utiliser dans une boucle foreach, cela déclencherait l'énumération.

+0

Acclamations mais l'article MSDN dit le contraire. J'ai également lu un article par quelqu'un qui avait utilisé un réflecteur dll pour regarder le code derrière une autre propriété d'objet SharePoint similaire ... il utilisait une requête CAML illimitée qui interrogeait et retournait chaque élément, CHAQUE fois que vous accédiez à la propriété. : \. Peut-être tort cependant. – user246091

+0

Je viens de vérifier Reflector. En effet, il crée un nouveau SPFileCollection chaque fois que l'on accède à la propriété mais il ne commence pas à l'énumérer. La même chose est vraie pour SPList.Items. – Josh

+0

Sweet. : D. Alors la nouvelle collection est vide? Je suppose que cela ne commence pas à énumérer jusqu'à ce que vous essayez d'accéder aux éléments de la liste. C'est à dire. l'itérateur de la collection exécute des tâches d'accès à la base de données et la collection a des méthodes pour repasser de nouveaux éléments dans la base de données de contenu après l'ajout à la collection et la mise à jour de l'appel .... Merci. Je mince k qui répond. : D – user246091

0

Avoir peur d'utiliser SPList.Items (similaire à SPList.Files, mais utilisé dans les listes simples, pas des bibliothèques de documents), nous avons créé une fonction d'aide qui retourne une collection vide, donc pas aller chercher tous les éléments du serveur:

public static SPListItemCollection CreateEmptyCollection(SPList List) 
{ 
    const string EmptyQuery = "0"; 
    SPQuery q = new SPQuery {Query = EmptyQuery}; 
    return List.GetItems(q); 
} 

Ensuite, lorsque vous ajoutez des éléments à une liste, nous le faisons comme ceci:

ListItem = CreateEmptyCollection(someList).Add("/sites/somesite/lists/somelist/path/to/required/folder", SPFileSystemObjectType.File, ""); 
+0

Aha ... Je savais que j'avais vu ça quelque part! J'ai trouvé une fois et l'article qui a suggéré la même chose, mais en fait une méthode d'extension SPList. Je vais ajouter un post. Santé mec. – user246091

0

Merci naivists. Vous avez rappelé que j'ai déjà vu un article qui suggérait la même chose mais comme une méthode d'extension sur 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); 
    }