SharePoint Online – Browse folder from PC and upload to SharePoint Document library
Hello everybody,
Recently I got an opportunity to work on browse functionality using windows forms application.
The functionality is to select a folder from PC and upload the folder with files in it to SharePoint document library. Let’s get started!
Prerequisites:
- SharePoint Online Tenant.
- Simple window form application with only one button control on it to browse in Visual Studio IDE.
Scenario:
- Name of folder to be uploaded – Test Folder.
- Hierarchy of folder

Figure .1 Folder Hierarchy
Let’s see how code works:
- When browse button is clicked, it opens “Browse for Folder” dialog to select and upload folder from.

Figure .2 Browse folders to upload
- Select the source folder (Test Folder) from drive and click OK.

Figure .3 Select folder to upload
- As soon as OK button is clicked, code will perform its first step to connect to SharePoint site with the site url and credentials provided in app.config file.
- Detailed comments are provided in the code to make it easy to understand and self explanatory.
- Detailed code is given below.
Code:
App.Config file
<?xml version="1.0" encoding="utf-8" ?> <configuration> <startup> <supportedRuntime version="v4.0" sku=".NETFramework,Version=v4.5.2" /> </startup> <appSettings> <add key="SiteURL" value="Provide SP site collection url here"/> <add key="Username" value="Provide your username here"/> <add key="Password" value="Provide your password here"/> </appSettings> </configuration>
Form1.cs
using Microsoft.SharePoint.Client; using System; using System.Configuration; using System.Data; using System.IO; using System.Linq; using System.Security; using System.Windows.Forms; namespace BrowseAndUploadFiles { public partial class Form1 : System.Windows.Forms.Form { public Form1() { InitializeComponent(); this.buttonBrowse.Click += new System.EventHandler(this.buttonBrowse_Click); } /// /// Browse button click event handler - When clicked it opens browse files dialog to select folder to upload. /// //////private void buttonBrowse_Click(object sender, EventArgs e) { try { FolderBrowserDialog folderDialog = new FolderBrowserDialog(); folderDialog.ShowNewFolderButton = true; DialogResult result = folderDialog.ShowDialog(); if (result == DialogResult.OK) { //textBoxFilename.Text = folderDialog.SelectedPath; //This step is not mandatory string filename = folderDialog.SelectedPath; Environment.SpecialFolder root = folderDialog.RootFolder; #region Code to Connect to SharePoint site //Read details from app.config file string siteURL = ConfigurationManager.AppSettings["SiteURL"]; string userName = ConfigurationManager.AppSettings["UserName"]; string password = ConfigurationManager.AppSettings["Password"]; ClientContext clientContext = new ClientContext(siteURL); SecureString securePassword = new SecureString(); //Formation of secure password string foreach (char c in password.ToCharArray()) securePassword.AppendChar(c); clientContext.Credentials = new SharePointOnlineCredentials(userName, securePassword); //Load the web Web web = clientContext.Web; clientContext.Load(web); clientContext.ExecuteQuery(); #endregion //Call to the method which uploads folders recursively to Documents library on SharePoint site UploadFoldersRecursively(clientContext, filename, "Documents"); MessageBox.Show("File upload complete", "buttonBrowse_Click", MessageBoxButtons.OK, MessageBoxIcon.Information); }//if (result == DialogResult.OK) }//try catch (Exception ex) { MessageBox.Show(ex.Message); } }//buttonBrowse_Click() #region UploadFoldersRecursively /// /// Method to upload folder - Selected folder on PC gets created on SP site in Document library /// /////////public static void UploadFoldersRecursively(ClientContext clientContext, string sourceFolder, string destinationLibraryTitle) { try { //Load detination library Web web = clientContext.Web; var query = clientContext.LoadQuery(web.Lists.Where(p =&amp;gt; p.Title == destinationLibraryTitle)); clientContext.ExecuteQuery(); List documentsLibrary = query.FirstOrDefault(); var folder = documentsLibrary.RootFolder; DirectoryInfo dir = new DirectoryInfo(sourceFolder); clientContext.Load(documentsLibrary.RootFolder); clientContext.ExecuteQuery(); folder = documentsLibrary.RootFolder.Folders.Add(dir.Name); clientContext.ExecuteQuery(); UploadFolder(clientContext, dir, folder); }//try catch(Exception ex) { MessageBox.Show(ex.Message, "UploadFoldersRecursively", MessageBoxButtons.OK, MessageBoxIcon.Error); } }//public static void UploadFoldersRecursively(ClientContext clientContext, string sourceFolder, string destinationLibraryTitle) #endregion #region UploadFolder /// /// Method to upload a folder - Uploads folder recursively that means if selected folder to upload contains more folders /// in it then it uploads each and every folder and files under every folder to sharepoint site /// /////////public static void UploadFolder(ClientContext clientContext, System.IO.DirectoryInfo folderInfo, Folder folder) { FileInfo[] files = null; DirectoryInfo[] subDirs = null; try { //Get all files from the folder files = folderInfo.GetFiles("*.*"); if (files != null) { //Loop through each document and upload it separately foreach (FileInfo file in files) { //Console.WriteLine(file.FullName); clientContext.Load(folder); clientContext.ExecuteQuery(); UploadDocument(clientContext, file.FullName, folder.ServerRelativeUrl + "/" + file.Name); }//foreach (System.IO.FileInfo file in files) subDirs = folderInfo.GetDirectories(); //Loop through each folder recursively foreach (DirectoryInfo dirInfo in subDirs) { Folder subFolder = folder.Folders.Add(dirInfo.Name); clientContext.ExecuteQuery(); UploadFolder(clientContext, dirInfo, subFolder); }//foreach (System.IO.DirectoryInfo dirInfo in subDirs) }//if (files != null) }//try catch(Exception ex) { MessageBox.Show(ex.Message, "UploadFolder", MessageBoxButtons.OK, MessageBoxIcon.Error); } }//public static void UploadFolder(ClientContext clientContext, System.IO.DirectoryInfo folderInfo, Folder folder) #endregion #region UploadDocument /// /// Method to upload document in the folder /// /////////public static void UploadDocument(ClientContext clientContext, string sourceFilePath, string serverRelativeDestinationPath) { try { using (var fs = new FileStream(sourceFilePath, FileMode.Open)) { var file = new FileInfo(sourceFilePath); //Upload each document to the destination folder Microsoft.SharePoint.Client.File.SaveBinaryDirect(clientContext, serverRelativeDestinationPath, fs, true); }//using (var fs = new FileStream(sourceFilePath, FileMode.Open)) }//try catch (Exception ex) { MessageBox.Show(ex.Message, "UploadDocument", MessageBoxButtons.OK, MessageBoxIcon.Error); } }//UploadDocument(ClientContext clientContext, string sourceFilePath, string serverRelativeDestinationPath) #endregion }//namespace BrowseAndUploadFiles }//public partial class Form1 : System.Windows.Forms.Form
References:
- https://docs.microsoft.com/en-us/sharepoint/dev/solution-guidance/upload-large-files-sample-app-for-sharepoint
- https://www.c-sharpcorner.com/blogs/uploading-files-to-document-library-sharepoint-online1
Thanks for reading 🙂
Keep reading, share your thoughts, experiences. Feel free to contact us to discuss more. If you have any suggestion / feedback / doubt, you are most welcome.
Stay tuned on Knowledge-Junction, will come up with more such articles.
good