2013-05-08 2 views
6

하위 폴더가 포함 된 문서 라이브러리에서 모든 목록 항목을 검색하기 위해 클라이언트 측 개체 모델 방식 C#을 사용하고 있습니다. MSDN 설명서를 체크 아웃하고 필드 속성을 가져올 수없는 이유 또는 내가이 일을 제대로 수행하지 못하는 경우에 붙어 있습니다.문서 라이브러리의 모든 하위 폴더에서 모든 문서 가져 오기 - 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);      
          } 
         } 
        } 
      } 
     } 

내가 수신하고이 오류는 "foreach는 (subFolder.Files에서 파일 f는)"컬렉션에 오류가 초기화되지 않을 수 있다는 것이다. CSOM을 사용하여 문서 라이브러리 내의 모든 하위 폴더에있는 모든 문서의 필드 값을 가져올 수 있습니까?

필드 값을 목록 항목 즉, (listItem [ "fieldName"])과 함께 강하게 입력 할 수 있다는 것을 알고 있습니다. 대신이 길로 가야합니까?

답변

7

몇 가지 권장 사항 :

1) 예를 들어, 특정 목록을로드 할 수 ClientRuntimeContext.LoadQuery method을 선호 :

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

2) 셰어 SCOM이 Request Batching을 지원하기 때문에 수를 최소화하는 것이 좋습니다 서버에 대한 요청 수 다음의 예는 문서 라이브러리에서 모든 파일을로드하기 위해 서버에 단일 요청을 수행하는 방법을 보여줍니다

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) 아래에서 입증 된 바와 같이 CAML 쿼리를 통해 모든 파일을로드 고향 :

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

그런 다음 예는 라이브러리에있는 모든 파일을 반환합니다 : 그것은 더 싸다의 방법을 최적화

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

성능 관점

전체 예제에서 특정 목록을 ading 셰어 CSOM 사용하여 문서 라이브러리에서 모든 파일을로드하는 방법

:

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

당신의 접근 방식은 정말 좋은 것 같아요,하지만 난 NotSupportedException 점점'items.Select (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

당신은 "list.RootFolder"에 대한 추가 쿼리 부하를 누락하고 다음 "list.RootFolder.Folders". 만약 당신이 그들을 추가하지 않으면,이 작동하지 않습니다 (초기화 오류를 제공합니다.하지만 가까이에 점점 +1.) –

관련 문제