For this to work, you will need to obtain a copy of the SharePoint Client DLL (microsoft.sharepoint.client.dll).
On a server with SharePoint intalled:
SharePoint 2010: 14 hive
SharePoint 2013: 15 hive
SharePoint 2016: 16 hive
C:\Program Files\Common Files\Microsoft Shared\Web Server Extensions\
In Visual Studio, create a console application and name it Download_All_Files. Copy all the code below and paste it into your code window. Update site URLs and list name (Taco Storage).
Using this process, I was able to download 10,000 documents from a library. Took around 30 minutes to complete.
using System;
using System.IO;
using Microsoft.SharePoint.Client;
namespace Download_All_Files
{
class Program
{
static void Main(string[] args)
{
// input YOUR URL below
var site = new ClientContext("http://sharepoint/sites/somesite");
var web = site.Web;
site.Load(web);
site.ExecuteQuery();
// CHANGE THIS to your library name, get this from the Library Settings page
List list = web.Lists.GetByTitle("Taco Storage");
site.Load(list);
site.ExecuteQuery();
site.Load(list.RootFolder);
site.ExecuteQuery();
site.Load(list.RootFolder.Folders);
site.ExecuteQuery();
processFolderClientobj(list.RootFolder.ServerRelativeUrl);
foreach (Folder folder in list.RootFolder.Folders)
{
processFolderClientobj(folder.ServerRelativeUrl);
}
}
public static void processFolderClientobj(string folderURL)
{
// folder on your computer where all the files will be downloaded to
string Destination = @"C:\\yourFolder";
// input YOUR URL below
var site = new ClientContext("http://sharepoint/sites/somesite");
var web = site.Web;
site.Load(web);
site.ExecuteQuery();
Folder folder = web.GetFolderByServerRelativeUrl(folderURL);
site.Load(folder);
site.ExecuteQuery();
site.Load(folder.Files);
site.ExecuteQuery();
foreach (Microsoft.SharePoint.Client.File file in folder.Files)
{
string destinationfolder = Destination + "/" + folder.ServerRelativeUrl;
Stream fs = Microsoft.SharePoint.Client.File.OpenBinaryDirect(site, file.ServerRelativeUrl).Stream;
byte[] binary = ReadFully(fs);
if (!Directory.Exists(destinationfolder))
{
Directory.CreateDirectory(destinationfolder);
}
FileStream stream = new FileStream(destinationfolder + "/" + file.Name, FileMode.Create);
BinaryWriter writer = new BinaryWriter(stream);
writer.Write(binary);
writer.Close();
}
}
public static byte[] ReadFully(Stream input)
{
byte[] buffer = new byte[16 * 1024];
using (MemoryStream ms = new MemoryStream())
{
int read;
while ((read = input.Read(buffer, 0, buffer.Length)) > 0)
{
ms.Write(buffer, 0, read);
}
return ms.ToArray();
}
}
}
}