In this article, we explore how to determine if a path is a file or a directory in C#.

To download the source code for this article, you can visit our GitHub repository.

We have two main approaches to determining whether a path is a file or a directory. The first checks if the path exists as a file or a directory, while the second checks the path’s attributes.

Checking Directory and File Existence

Let’s begin by defining a path, which is a string that locates a resource inside the file system, and we use it to identify both files and directories.

Support Code Maze on Patreon to get rid of ads and get the best discounts on our products!
Become a patron at Patreon!

In .NET we have two pairs of classes helping us with this task, File and Directory, and FileInfo and DirectoryInfo. 

File methods are similar to FileInfo methods, and Directory methods are akin to DirectoryInfo methods.

For an in-depth look at the differences among these classes, please refer to our articles, File and FileInfo Class Comparison in C# and Managing Directories With Directory and DirectoryInfo in C#.

Let’s see how to use these classes to distinguish a file from a directory.

Using Directory and File Classes

File and Directory are static classes, so we don’t need to create instances of them.

Both classes have an Exists() method. Let’s create a file to see how these methods work:

var testFile = Path.Combine(Path.GetTempPath(), "test_file.abc");
File.CreateText(testFile);

bool isFile = File.Exists(testFile);
bool isDirectory = Directory.Exists(testFile);

With File.Exists(), we check if the path exists as a file, and it returns true. We also useDirectory.Exists() to check if test_file.abc exists as a directory, and the result is false.

Let’s try with a directory:

var testDirectory = Path.Combine(Path.GetTempPath(), "test_directory");
Directory.CreateDirectory(testDirectory);

bool isFile = File.Exists(testDirectory);
bool isDirectory = Directory.Exists(testDirectory);

This time Directory.Exists() returns true, while File.Exists() returns false.

Now we check the same functions when neither a directory nor a file exists:

var notExistingPath = "someNotExistingPath";

bool isFile = File.Exists(notExistingPath);
bool isDirectory = Directory.Exists(notExistingPath);

Both File.Exists() and Directory.Exists() return false.

We used File.Exists() and Directory.Exists() to discover if a path is a file or a directory, or if it’s neither a file nor a directory. Let’s see how we can do the same by using DirectoryInfo and FileInfo.

Using DirectoryInfo and FileInfo Classes

FileInfo and DirectoryInfo work similarly to File and Directory, but they aren’t static. Consequently, we have to create an instance of them, passing the path to the constructor.

When we use FileInfo and DirectoryInfo, file access and security checks happen only once at the object creation. So, if we need to perform a lot of path operations, it’s more convenient to use FileInfo and DirectoryInfo than File and Directory. The latter performs file access on every method call.

Anyway, we have to be careful when using FileInfo and DirectoryInfo, because they cache information. If we create an instance of the FileInfo object before creating the file, the Exists property returns false even after the file creation. We avoid this by using the Refresh() method.

FileInfo and DirectoryInfo have an Exists property that returns the identical result as the Exists() method of File and Directory.

Let’s use FileInfo and DirectoryInfo to check the existence of a file:

var testFile = Path.Combine(Path.GetTempPath(), "test_file2.abc");
File.CreateText(testFile);

var fileInfo = new FileInfo(testFile);
var directoryInfo = new DirectoryInfo(testFile);

bool isFile = fileInfo.Exists;
bool isDirectory = directoryInfo.Exists;

Checking testFile we receive the expected results, fileInfo.Exists returns true, whereas directoryInfo.Exists returns false.

Dealing with directories is quite straightforward:

var testDirectory = Path.Combine(Path.GetTempPath(), "test_directory2");
Directory.CreateDirectory(testDirectory);

var fileInfo = new FileInfo(testDirectory);
var directoryInfo = new DirectoryInfo(testDirectory);

bool isFile = fileInfo.Exists; 
bool isDirectory = directoryInfo.Exists;

With testDirectory, fileInfo.Exists returns false, anddirectoryInfo.Exists returns true.

Let’s have a look at how to manage when neither a directory nor a file exists:

var notExistingPath = "someNotExistingPath2";

var fileInfo = new FileInfo(notExistingPath);
var directoryInfo = new DirectoryInfo(notExistingPath);

bool isFile = fileInfo.Exists; 
bool isDirectory = directoryInfo.Exists;

In this case, both fileInfo.Exists and directoryInfo.Exists returns false, because notExistingPath doesn’t exist as a file or a directory.

We have seen how to understand if a path refers to a file or a directory by checking its existence with the FileInfo and DirectoryInfo classes.

Let’s explore now how we can distinguish a file from a directory with FileAttributes.

Using FileAttributes

The FileAttributes enum provides us with information about the path. For instance, it tells us if the file is a normal file, a directory, if it’s hidden, read-only, compressed, and many other things. We can find all the details by reading FileAttributes Enum on Microsoft Learn.

Let’s see how we can use it:

var testFile = Path.Combine(Path.GetTempPath(), "test_file4.abc");
File.CreateText(testFile);

var attributes = File.GetAttributes(testFile);

isDirectory = attributes.HasFlag(FileAttributes.Directory);
isFile = !isDirectory;

If the path exists, the FileAttributes.Directory flag tells us that the path is a directory; if this flag is not set, the path is a file for sure.

When the path doesn’t exist, File.GetAttributes() throws a FileNotFoundException:

var notExistingPath = "someNotExistingPath4";

bool isFile;
bool isDirectory;
try
{
    var attributes = File.GetAttributes(notExistingPath);
    isDirectory = attributes.HasFlag(FileAttributes.Directory);
    isFile = !isDirectory;
}
catch (FileNotFoundException)
{
    isFile = isDirectory = false;
}

If we use FileAttributes, we have to catch FileNotFoundException to check for the existence of the path.

It’s important to note that we can’t use FileAttributes.Directory on all platforms. It’s only supported on Windows, Linux, and macOS, as stated in Microsoft’s documentation. Therefore, it won’t work on iOS or Android.

We showed how to get the FileAttributes and use them to understand if a path is a file or a directory.

Conclusion

In summary, we showed two ways to test if a path is a file or a directory in C#. We can check if a path exists as a file or a directory with the File, Directory, FileInfo, and DirectoryInfo classes. We then explored another possibility using the FileAttributes. If our operating system supports it, we can get the FileAttributes from the path and check whether the Directory flag is set. 

Liked it? Take a second to support Code Maze on Patreon and get the ad free reading experience!
Become a patron at Patreon!