Tag Archives: subfolders

[C#] How to get all folders and sub-folders within a path?

2
Filed under C\C++\C#, General, How to?, Programming, Source code, Tutorials
Tagged as , , , ,

Hi,

As you probably may know, C# library has a function that allows you to get all folders and sub-folders within a certain path. Even though it’s simple and easy to use, you can face a few problems when trying to access files that for some reason are not accessible. This simply throws an exception and the application fails.
When searching for sub-folders, there is no way to get all the exceptions thrown since they can be quite a lot, so the solution is to do a ‘get folders and sub-folders’ function yourself. Note that when we simply want the folders within a path (no sub-folders) then it is possible to catch the exceptions.
The code provided below was used in my project TextFindIT.

The function below will get all folders and sub-folders within a path and will add the results to a List of strings.

1
2
3
   //Get folders in a path
   List<string> folders = new List<string>(); // Our list of folders where we will keep the results
   folders = GetAllFolders(path); // Call the function

So the code above will just call our function and send a valid path path.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
   //Returns all folders inside a folder, including sub-folders
   private List<string> GetAllFolders(string path)
   {
       List<string> folders = new List<string>(); // The list of results to be returned
       folders.Add(path); // Our first result is our path (top folder)
 
       // For each folder in our path, we will add the folder to the list, and check for sub-folders within that folder.
       foreach (string folder in GetFolders(path))
       {
          folders.Add(folder); // Add the folder as a result
          folders.AddRange(GetAllFolders(folder).ToList()); // Get all folders and sub-folders within the folder
       }
 
       return folders; // Return the list of results
   }
 
   //Returns all folders inside a folder (top only)
   private string[] GetFolders(string path)
   {
      string[] folders = { }; // Array of results
 
      // Below we try to add the folders inside 'path' and catch any possible exceptions.
      try
      {
         folders = Directory.GetDirectories(path, "*", SearchOption.TopDirectoryOnly);
      }
      catch
      {
         //catch exceptions to avoid breaking the search
      }
 
      return folders; // Return the results
   }

So basically, for each folder inside our path, we will check for sub-folders, and for each sub-folder we will also check for sub-folders, and so on…
Notice the line folders.AddRange(GetAllFolders(folder).ToList());. We are calling the function GetAllFolders while still inside of that same function. This is called Recursion. Also, because GetAllFolders returns a List of strings with the results, we must do .AddRange(...) to add to our main List of strings the entire list of results (i.e. add a List to a List).
In the second function, we just put in an array all the folders inside path by doing Directory.GetDirectories(path, "*", SearchOption.TopDirectoryOnly); while catching any possible exception. path is our current path, * is the search pattern (in this case it’s anything), and the last parameter SearchOption.TopDirectoryOnly is our search options (top only). Because we are not trying to go for sub-folders it is possible to do this (catch the exceptions), otherwise it wouldn’t.

And I guess that’s basically it.
Hope you find it useful.