2013-05-08 58 views
6

Alt klasörleri içeren bir belge kitaplığından tüm liste öğelerini almak için istemci tarafı nesne modeli yaklaşımı C# kullanıyorum. MSDN belgelerini kontrol ettim ve neden arazi mülkünü alamıyorsam, ya da bu hakkı bile yapıyorum.Belge Kitaplığı'ndaki tüm Alt Klasörlerden Tüm Belgeleri Geri Al - CSOM

NetworkCredential credentials = System.Net.CredentialCache.DefaultNetworkCredentials; 
      ClientContext clientcontext = new ClientContext(Resources.defaultSPSite); 
      clientcontext.Credentials = credentials; 

      //Load Libraries from SharePoint 
      //Web site = clientcontext.Web; 
      clientcontext.Load(clientcontext.Web.Lists); 
      clientcontext.ExecuteQuery(); 


      //List sharedDocumentsList = clientcontext.Web.Lists.GetByTitle("TestLDOCS"); 
      //CamlQuery camlQuery = new CamlQuery(); 
      //camlQuery.ViewXml = @"<View Scope='Recursive'><Query></Query></View>"; 

      foreach (List list in clientcontext.Web.Lists) 
      { 
       clientcontext.Load(list); 
       clientcontext.ExecuteQuery(); 
       //list.TemplateFeatureId.ToString().Equals("") && 
        string baseType = list.BaseType.ToString(); 
        string listTitle = list.Title.ToString(); 
        if (list.BaseType.ToString().Equals("DocumentLibrary", StringComparison.InvariantCultureIgnoreCase) && list.Title.ToString().Equals("TestLDOCS", StringComparison.InvariantCultureIgnoreCase)) 
        { 
         foreach (Folder subFolder in list.RootFolder.Folders) 
         { 
          foreach (File f in subFolder.Files) 
          { 
           Console.WriteLine((string) f.Title);      
          } 
         } 
        } 
      } 
     } 

ben alıyorum hata "foreach (subFolder.Files Dosya f)" toplama hatası başlatılmamış olabilir olmasıdır. Her bir alt klasördeki tüm belgelerin alan değerlerini CSOM kullanarak bir doküman kütüphanesi içinde almak için var mı?

Alan değerlerini bir liste öğesiyle (ör. ListItem ["fieldName"]) yazabilirsiniz. Bunun yerine bu rotaya gitmeli miyim?

cevap

7

bazı öneriler:

1), örneğin, belirli bir listeler yüklemek için ClientRuntimeContext.LoadQuery method tercih:

var lists = ctx.LoadQuery(ctx.Web.Lists.Where(l => l.BaseType == BaseType.DocumentLibrary)); 
ctx.ExecuteQuery(); 

2), SharePoint SCOM Request Batching destekler beri sayısını en aza indirmek için önerilir sunucuya isteklerin. Aşağıdaki örnek belge kütüphanelerinden tüm dosyaları yüklemek için sunucuya bir tek isteği gerçekleştirmek gösterilmiştir:

foreach (var list in lists) 
{ 
    var items = list.GetItems(CreateAllFilesQuery()); 
    ctx.Load(items, icol => icol.Include(i => i.File)); 
    results[list.Title] = items.Select(i=>i.File); 
} 
ctx.ExecuteQuery(); 

3) aşağıda gösterildiği gibi CAML sorgusu yoluyla tüm dosyaları yüklemek için tercih et:

public static CamlQuery CreateAllFilesQuery() 
{ 
    var qry = new CamlQuery(); 
    qry.ViewXml ="<View Scope=\"RecursiveAll\"><Query><Where><Eq><FieldRef Name=\"FSObjType\" /><Value Type=\"Integer\">0</Value></Eq></Where></Query></View>"; 
    return qry; 
} 

daha sonra aşağıdaki örnek kitapları tüm dosyaları döndürür: daha lo yolunu optimize edilmiştir

var items = list.GetItems(CreateAllFilesQuery()); 
ctx.Load(items, icol => icol.Include(i => i.File)); 
ctx.ExecuteQuery(); 
var files = items.Select(i=>i.File).ToList(); 

Performans açısından

tam örnek belirli listeleri ading SharePoint CSOM kullanarak belge kütüphanelerinden tüm dosyaları yüklemek nasıl

:

using (var ctx = new ClientContext(webUri)) 
{ 

    var results = new Dictionary<string, IEnumerable<File>>(); 
    var lists = ctx.LoadQuery(ctx.Web.Lists.Where(l => l.BaseType == BaseType.DocumentLibrary)); 
    ctx.ExecuteQuery(); 
    foreach (var list in lists) 
    { 
     var items = list.GetItems(CreateAllFilesQuery()); 
     ctx.Load(items, icol => icol.Include(i => i.File)); 
     results[list.Title] = items.Select(i=>i.File); 
    } 
    ctx.ExecuteQuery(); 

    //Print results 
    foreach (var result in results) 
    { 
     Console.WriteLine("List: {0}",result.Key); 
     foreach (var file in result.Value) 
     { 
      Console.WriteLine("File: {0}", file.Name); 
     } 
     }   
} 
+0

Yaklaşımınız gerçekten çok iyi görünüyor, ancak NotSupportedException öğesini item'lerde alıyorum.Seçin (i => i.File) ' – Santhos

1
foreach (List list in clientcontext.Web.Lists) 
     { 
      clientcontext.Load(list); 
      clientcontext.ExecuteQuery(); 
      //list.TemplateFeatureId.ToString().Equals("") && 
       string baseType = list.BaseType.ToString(); 
       string listTitle = list.Title.ToString(); 
       if (list.BaseType.ToString().Equals("DocumentLibrary", StringComparison.InvariantCultureIgnoreCase) && list.Title.ToString().Equals("TestLDOCS", StringComparison.InvariantCultureIgnoreCase)) 
       { 
        foreach (Folder subFolder in list.RootFolder.Folders) 
        { 
      clientcontext.Load(subFolder.Files); 
        clientcontext.ExecuteQuery(); 
         foreach (File f in subFolder.Files) 
         { 
          Console.WriteLine((string) f.Title);      
         } 
        } 
       } 
     } 
    } 
+0

Sen "list.RootFolder" için ek sorgu yükleri eksik ve sonra "list.RootFolder.Folders". Bunları eklemezseniz, bu işe yaramazsa (başlatma hatası verin. Ama beni daha yakınlaştırmak için +1.) –