
One thing that you often need and that is quite annoying to get in a default SharePoint installation is the total number of files in a document library and all of its sub-folders. The most common advice is to open the explorer view and then navigate through the folders and add up the file totals, but this becomes tedious really quickly if you have a library with numerous files and folders. Another option is to write a PowerShell script, but then you need to be on the SharePoint server itself and with an account that doesn’t have access to the document libraries. Also, in the case of PowerShell, you’ll quickly become annoyed with the many bad script examples out there that don’t work and end up taking your time.
So what to do? Well, the simplest way is just to start up Visual Studio on your PC and write a basic Windows forms application. See the image at the start of this article for the user interface (UI) I put together. It should work well with the code example below.
In the UI, there is a button to run the search and text boxes to enter the URL of your SharePoint Site Collection, and another text box where you enter the name of your document library. There are also two text boxes to show the results: the first shows the grand total of documents in the library, and the second lists them all in one big list.
Summing up the Important Parts of the Code
To briefly skim some of the code highlights, you need to:
- Create a new ClientContext instance where we pass in the URL of the SharePoint site collection.
- Then get the document library that you are interested in using: clientContext.Web.Lists.GetByTitle(tbLibraryName.Text)
- You can then get the full list of files in the document library and its sub-folders using a CamlQuery where you set the scope to be Recursive
- After you execute your CamlQuery, you can get the total number of files using .Count on the ListItemCollection you are using to store the file information
- Also, you can loop through each item in the ListItemCollection and derive information about each file (like getting the file name using FieldValues(“FileLeafRef”) )
The Code in VB.NET
Here is the VB.NET code for a classic Windows form application. Naturally you need to first add in references to SharePoint libraries in your project before you can begin to code. Here is an article where I explain how to add these references.
Imports Microsoft.SharePoint.Client Public Class Form1 Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click tbTotalDocs.Text = "" tbDocumentList.Text = "" Using clientContext As New ClientContext(tbURL.Text) Dim docList As List = clientContext.Web.Lists.GetByTitle(tbLibraryName.Text) clientContext.Load(docList) Dim camlQuery As New CamlQuery() camlQuery.ViewXml = "<View Scope='Recursive'><Query><Where><Eq><FieldRef Name='FSObjType' /><Value Type='Lookup'>0</Value></Eq></Where></Query></View>" Dim listItems As ListItemCollection = docList.GetItems(camlQuery) clientContext.Load(listItems) clientContext.ExecuteQuery() tbTotalDocs.Text = listItems.Count For Each listItem As ListItem In listItems Dim strName As String = listItem.FieldValues("FileLeafRef").ToString() tbDocumentList.Text &= strName & ControlChars.CrLf Next End Using End Sub End Class
The Code in C#
Here’s the same code, but auto code-converted into C#. If there is a problem, just use the VB code above, because I wrote and tested the app only in VB.NET:
private void Button1_Click(object sender, EventArgs e) { tbTotalDocs.Text = ""; tbDocumentList.Text = ""; Using ClientContext clientContext = new ClientContext(tbURL.Text){ List docList = clientContext.Web.Lists.GetByTitle(tbLibraryName.Text); clientContext.Load(docList); CamlQuery camlQuery = new CamlQuery(); camlQuery.ViewXml = "<View Scope=\'Recursive\'><Query><Where><Eq><FieldRef Name=\'FSObjType\' /><Value Type=\'Lookup\'>0</Value></Eq></Where></Query></View>"; ListItemCollection listItems = docList.GetItems(camlQuery); clientContext.Load(listItems); clientContext.ExecuteQuery(); tbTotalDocs.Text = listItems.Count; foreach (ListItem listItem in listItems) { string strName = listItem.FieldValues("FileLeafRef").ToString(); (strName + ControlChars.CrLf); } } }