C# Recursive File List: GetFiles With AllDirectories

Use Directory.GetFiles with AllDirectories and EnumerateFiles to recursively get lists of files.

Recursive file list. Directories are often nested. Sometimes we need a list of files in a folder, and also those in each subdirectory.

AllDirectories. The .NET Framework allows a SearchOption.AllDirectories argument to the Directory.GetFiles and EnumerateFiles methods. This is the easiest way to recursively get files.Directory.GetFilesFile

GetFiles. This program gets a string array of all the files at a certain level of the file system. It also covers all sublevels. Then, it loops through the result and prints the file paths.

Tip: You can see that the first level files in the specified directory are printed, and then all subdirectory files as well.


Argument 1: The first argument to Directory.GetFiles is the starting path. You must escape the backslashes in Windows paths.

Argument 2: The second argument is the universal pattern for file names. If you change the asterisks to a string, you can filter files.

Argument 3: The third argument is the enumerated constant SearchOption.AllDirectories, which indicates you want a recursive file search.

C# program that lists files recursively using System; using System.IO; class Program { static void Main() { // Get list of files in the specific directory. // ... Please change the first argument. string[] files = Directory.GetFiles("C:\\PerlsComStage\\", "*.*", SearchOption.AllDirectories); // Display all the files. foreach (string file in files) { Console.WriteLine(file); } } } Output C:\PerlsComStage\Default.aspx C:\PerlsComStage\Global.asax C:\PerlsComStage\Web.config C:\PerlsComStage\bin\PerlsComWebProject1.dll C:\PerlsComStage\bin\PerlsComWebProject1.pdb

List example. We convert the array returned by Directory.GetFiles to a List. Then we pass the List instance to another method and display the value returned by its Count property.List

Note: In early versions of the .NET Framework, it may have been necessary to implement custom recursive file search algorithms.

But: Today these methods are unnecessary because they overlap with existing functionality.

C# program that gets file List using System; using System.Collections.Generic; using System.IO; class Program { static void Main() { // Make sure directory exists before using this! var files = new List<string>(Directory.GetFiles("C:\\folder", "*.*", SearchOption.AllDirectories)); Method(files); } static void Method(List<string> files) { Console.WriteLine(files.Count); } } Output 22

EnumerateFiles. This method receives the directory path as its first argument. The second two arguments are optional. To recurse through directories, use AllDirectories.

Tip: With EnumerateFiles, we receive an IEnumerable<string>. This must be evaluated in a foreach-loop or extension method.


Note: Thanks to Csaba Toth for pointing out the EnumerateFiles method, added in the .NET Framework 4.0.

C# program that uses EnumerateFiles using System; using System.IO; class Program { static void Main() { // Call EnumerateFiles in a foreach-loop. foreach (string file in Directory.EnumerateFiles(@"c:\files", "*.*", SearchOption.AllDirectories)) { // Display file path. Console.WriteLine(file); } } } Output c:\files\index.html c:\files\style.css c:\files\images\logo.png c:\files\images\picture.jpg

Notes, custom methods. It is possible to develop a method that uses recursion, or stack-based recursion, to scan directories. This is fun to do, and may be a good learning experience.

But: For real programs, using AllDirectories is probably a much better choice due to its well-tested implementation.

A summary. Directory.GetFiles method can perform a recursive file listing. Instead of custom implementations, this method overload provides a clearer, simpler abstraction.
Dot Net Perls
© 2007-2020 Sam Allen. Every person is special and unique. Send bug reports to