How to Get All the Files within a Folder using CAML Query in SharePoint Office 365 using C# CSOM


Sathish Nadarajan
SharePoint MVP
Published On :   11 Jul 2017
Visit Count
Today :  29    Total :   2247
Plan, Migrate, Secure, Report
SharePoint & Office 365 Tool. Simple & Easy to Use. 15-Day Trial!

SharePoint Office 365 Tool
Simple & Powerful Tool for Migration, Security & Reporting. Free Trial


Recently met with a requirement to get all the Files alone from a Folder using CAML Query. Thought of sharing the small piece of code to the community and make sure that whether to use RECURSIVE and RECURSIVEALL.

Basically, the requirement is as below.

clip_image001

By Executing a CAML Query, I want to get the Three Files (File1, File2, File3). The below Simple CAML Query will retrieve only three files from the Folder Folder1

 using Microsoft.SharePoint.Client;
  
 
 namespace Office365.Console
 {
     class Program
     {
         static void Main(string[] args)
         {
             GetFiles();
         }
 
         public static void GetFiles()
         {
             OfficeDevPnP.Core.AuthenticationManager authMgr = new OfficeDevPnP.Core.AuthenticationManager();
 
             string sourceSiteUrl = "https://*********.sharepoint.com/sites/RecordCentre";
 
             string userName = "Sathish@*********.onmicrosoft.com";
             string password = "*********";
 
             var clientContext = authMgr.GetSharePointOnlineAuthenticatedContextTenant(sourceSiteUrl, userName, password);
 
             Web web = clientContext.Web;
             clientContext.Load(web);
             clientContext.Load(web.Lists);
             clientContext.Load(web, wb => wb.ServerRelativeUrl);
             clientContext.ExecuteQuery();
 
             List list = web.Lists.GetByTitle("MyRecordLibrary");
             clientContext.Load(list);
             clientContext.ExecuteQuery();
 
             Folder folder = web.GetFolderByServerRelativeUrl(web.ServerRelativeUrl + "/MyRecordLibrary/Folder1/");
             clientContext.Load(folder);
             clientContext.ExecuteQuery();
 
             CamlQuery camlQuery = new CamlQuery();
             camlQuery.ViewXml = @"<View Scope='Recursive'>
                                     <Query>
                                     </Query>
                                 </View>";
             camlQuery.FolderServerRelativeUrl = folder.ServerRelativeUrl;
             ListItemCollection listItems = list.GetItems(camlQuery);
             clientContext.Load(listItems);
             clientContext.ExecuteQuery();
 
         }
 
     }
 }
 
 

In some scenario, we may need to get the folders as well. In that case, a small change on the CAML query will retrieve 5 items. (3 Files and two Folders Folder1.1, Folder1.1.1)

 camlQuery.ViewXml = @"<View Scope='RecursiveAll'>
                                     <Query>
                                     </Query>
                                 </View>";
 
 

After getting that, we can find, whether it is a File or Folder using the Content Type or the FileSystemObjectType.

The complete piece of code will be

 CamlQuery camlQuery = new CamlQuery();
             camlQuery.ViewXml = @"<View Scope='RecursiveAll'>
                                     <Query>
                                     </Query>
                                 </View>";
             camlQuery.FolderServerRelativeUrl = folder.ServerRelativeUrl;
             ListItemCollection listItems = list.GetItems(camlQuery);
             clientContext.Load(listItems);
             clientContext.ExecuteQuery();
 
             foreach (var item in listItems)
             {
                 if (item.FileSystemObjectType == FileSystemObjectType.File)
                 {
                     // This is a File
                 }
                 else if (item.FileSystemObjectType == FileSystemObjectType.Folder)
                 {
                     // This is a  Folder
                 }
             }
 

Happy Coding,

Sathish Nadarajan.

SharePoint Usage Reports
Usage reports, collaboration and audit for SharePoint.
Categories

Protect Your SharePoint