How to Get all files in a folder in C#

By FoxLearn 12/24/2024 7:53:42 AM   17
If you need to get all files in a folder, there are two primary ways to do it: using Directory.GetFiles() and Directory.EnumerateFiles().

In this article, we will explore these two methods, compare them, and look at how to use them for different scenarios, including retrieving files from subfolders, getting just the filenames, and even retrieving FileInfo objects for more detailed information.

How to get all files with Directory.GetFiles() in C#?

The Directory.GetFiles() method returns all the file paths in a specified directory as a string array. It is simple and easy to use but loads all file paths into memory at once, which may be less efficient when dealing with large directories.

using System.IO;

string[] filePaths = Directory.GetFiles(@"C:\myfolder\");

Console.WriteLine($"File count: {filePaths.Length}");

foreach (var filePath in filePaths)
{
    Console.WriteLine(filePath);
}

How to get all files with Directory.EnumerateFiles() in C#?

While Directory.GetFiles() gives you all file paths upfront in a string array, Directory.EnumerateFiles() provides a more memory-efficient way to work with files. It returns an IEnumerable<string>, which means you can loop over the file paths one at a time without loading all of them into memory at once.

using System.IO;

var folderPath = @"C:\myfolder\";

foreach (var filePath in Directory.EnumerateFiles(folderPath))
{
    Console.WriteLine(filePath);
}

Since Directory.EnumerateFiles() yields file paths one at a time, it can be much more efficient when dealing with large directories, as it does not need to load all the file paths into memory at once.

How to get all files from a folder and subfolders in C#?

Both Directory.GetFiles() and Directory.EnumerateFiles() only retrieve files from the top-level directory by default. If you need to get files from subdirectories, you can use the SearchOption.AllDirectories parameter to include files from all levels of subfolders.

using System.IO;

var folderPath = @"C:\myfolder\";

foreach (var filePath in Directory.EnumerateFiles(folderPath, "*", SearchOption.AllDirectories))
{
    Console.WriteLine(filePath);
}

When using SearchOption.AllDirectories, you also need to specify a search pattern (e.g., "*" for all files) to match all files in the directory and its subdirectories.

If you only need the file names without the full paths, you can use Path.GetFileName() to extract the file name from each file path. One efficient way to do this is by using LINQ to transform the paths into file names.

using System.IO;
using System.Linq;

var folderPath = @"C:\myfolder\";

var fileNames = Directory.EnumerateFiles(folderPath)
    .Select(filePath => Path.GetFileName(filePath));

foreach (var fileName in fileNames)
{
    Console.WriteLine(fileName);
}

In this case, Directory.EnumerateFiles() is used to get all file paths, and then Path.GetFileName() is used to extract just the filenames. This approach avoids the need to work with the full paths if only the names are needed.

Sometimes, you may need more detailed information about the files, such as the creation date, file size, or file attributes. In this case, instead of using Directory.GetFiles() or Directory.EnumerateFiles(), you can use DirectoryInfo.EnumerateFiles(), which returns a collection of FileInfo objects.

using System.IO;

var directoryInfo = new DirectoryInfo(@"C:\myfolder\");

foreach (FileInfo fileInfo in directoryInfo.EnumerateFiles())
{
    Console.WriteLine($"{fileInfo.CreationTime} {fileInfo.Name} ({fileInfo.Length} bytes)");
}

In this example, DirectoryInfo.EnumerateFiles() returns a collection of FileInfo objects, allowing you to access detailed properties such as CreationTime and Length (file size in bytes) for each file.

Both Directory.GetFiles() and Directory.EnumerateFiles() are useful methods for retrieving files from a directory in C#. The choice between them depends on the specific needs of your application: