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