Get all items of a sharepoint list

19.5k views Asked by At

i want to download all files of my sharepoint list. I download the files with this method:

  public void DownloadFilesOfSpecialtys( )
       {


           using (var clientContext = new ClientContext(url))
           {

               foreach (var item in ids)
               {

                   int listItemId = int.Parse(item.ToString());
                   statics.files = int.Parse(ids.Count.ToString());

                   var list = clientContext.Web.Lists.GetByTitle(listtitle);
                   var listItem = list.GetItemById(listItemId);
                   clientContext.Load(list);
                   clientContext.Load(listItem, i => i.File);
                   clientContext.ExecuteQuery();

                   var fileRef = listItem.File.ServerRelativeUrl;
                   var fileInfo = Microsoft.SharePoint.Client.File.OpenBinaryDirect(clientContext, fileRef);
                   var fileName = Path.Combine(@path , (string)listItem.File.Name);



                   using (var fileStream = System.IO.File.Create(fileName))
                   {
                       fileInfo.Stream.CopyTo(fileStream);
                   }


               }


           }

       }

Now my Problem is, that the files in the sub folders arent downloaded with this methode. Is there an opportunityto go through all sub folders in my list and download all files?

2

There are 2 answers

0
Vadim Gremyachev On BEST ANSWER

Since your goal is:

to download all files of my SharePoint list

the following example demonstrates how to accomplish it:

using (var ctx = new ClientContext(webUri))
{
     var qry = new CamlQuery();
     qry.ViewXml = "<View Scope='RecursiveAll'>" +
                              "<Query>" + 
                                  "<Where>" + 
                                        "<Eq>" + 
                                             "<FieldRef Name='FSObjType' />" + 
                                             "<Value Type='Integer'>0</Value>" + 
                                        "</Eq>" + 
                                 "</Where>" + 
                               "</Query>" + 
                            "</View>"; 

    var sourceList = ctx.Web.Lists.GetByTitle(sourceListTitle);
    var items = sourceList.GetItems(qry);
    ctx.Load(items);
    ctx.ExecuteQuery();
    foreach (var item in items)
    {
        //1. ensure target directory exists
        var curPath = targetPath + System.IO.Path.GetDirectoryName((string)item["FileRef"]);
        Directory.CreateDirectory(curPath);
        //2. download a file
        DownloadAFile(item, curPath);   
     }
 }

where

    private static void DownloadAFile(Microsoft.SharePoint.Client.ListItem item,string targetPath)
    {
        var ctx = (ClientContext)item.Context;
        var fileRef = (string)item["FileRef"];
        var fileName = System.IO.Path.GetFileName(fileRef);
        var fileInfo = Microsoft.SharePoint.Client.File.OpenBinaryDirect(ctx, fileRef);
        var filePath = Path.Combine(targetPath, fileName);
        using (var fileStream = System.IO.File.Create(filePath))
        {
            fileInfo.Stream.CopyTo(fileStream);
        }
    }

Note: compatible with SharePoint 2010/2013 CSOM API

As a bonus, the folder structure will be preserved once files are downloaded

5
LInsoDeTeh On

When you have your listItem object, it might already be a folder, so you can treat it as a folder by using the .Folder property:

var listItemAsFolder = listItem.Folder;
if (listItemAsFolder != null) {
  // here you can access listItemAsFolder.Files to get all files in the folder
  // also, you can access listItemAsFolder.SubFolders to get all subfolders.
}

Btw, there's also a way back: WHen you have an SPFolder object, use .Item to treat it as a ListItem.