ZetCode

C# Directory

last modified May 1, 2025

This C# Directory tutorial demonstrates how to manage directories in C#. Our examples include creating, deleting, listing, and checking permissions of directories.

The C# List Directory tutorial provides a comprehensive guide on listing directory contents in C#, helping you navigate and manage file system structures effectively.

What Is a Directory?

A directory, commonly known as a folder, serves as a structured storage location for files on a computer. Directories can also contain subdirectories or shortcuts, allowing for organized data management.

Working with Directories in C#

C# provides two primary classes for directory handling:

Both classes are part of the System.IO namespace and serve distinct purposes—while Directory is ideal for quick operations, DirectoryInfo is better suited for working with directory objects and retrieving extended details.

C# create directory

Use the Directory.CreateDirectory method to create a directory.

Program.cs
var docPath = Environment.GetFolderPath(Environment.SpecialFolder.MyDocuments);

var dirName = $@"{docPath}\test";

DirectoryInfo di = Directory.CreateDirectory(dirName);
Console.WriteLine($"Full name: {di.FullName}, Name: {di.Name}, Parent: {di.Parent}");

if (Directory.Exists(dirName))
{
    Console.WriteLine("Directory exists");
}
else
{
    Console.WriteLine("Directory does not exist");
}

This example creates a test directory in the user's Documents folder.

var docPath = Environment.GetFolderPath(Environment.SpecialFolder.MyDocuments);

We retrieve the MyDocuments folder path using Environment.GetFolderPath.

var dirName = $@"{docPath}\test";

This defines the full path for the new directory.

DirectoryInfo di = Directory.CreateDirectory(dirName);
Console.WriteLine($"Full name: {di.FullName}, Name: {di.Name}, Parent: {di.Parent}");

The Directory.CreateDirectory method creates a directory and returns a DirectoryInfo object. We print its full name, name, and parent directory.

if (Directory.Exists(dirName))
{
    Console.WriteLine("Directory exists");
}
else
{
    Console.WriteLine("Directory does not exist");
}

The Directory.Exists method checks if the specified directory exists.

C# get current directory

The Directory.GetCurrentDirectory method retrieves the application's current working directory.

Program.cs
var curDir = Directory.GetCurrentDirectory();
Console.WriteLine(curDir);

Console.WriteLine(Directory.GetDirectoryRoot(curDir));

This program displays the current working directory and its root, obtained using Directory.GetDirectoryRoot.

$ dotnet run
C:\Users\Jano\Documents\csharp\directory\CurrentDirectory
C:\

C# delete directory

Use the Directory.Delete method to remove a directory.

Program.cs
var docPath = Environment.GetFolderPath(Environment.SpecialFolder.MyDocuments);
var myDir = $@"{docPath}/test3";

Directory.CreateDirectory(myDir);
Console.WriteLine(Directory.Exists(myDir));

Directory.Delete(myDir);
Console.WriteLine(Directory.Exists(myDir));

This example creates a directory, verifies its existence, deletes it, and checks its existence again.

$ dotnet run
True
False

C# move directory

The Directory.Move method renames or moves a directory.

Program.cs
var docPath = Environment.GetFolderPath(Environment.SpecialFolder.MyDocuments);

var sourceDir = $@"{docPath}\test";
var destDir = $@"{docPath}\test2";

Directory.Move(sourceDir, destDir);

This example renames a directory.

Directory.Move(sourceDir, destDir);

The Directory.Move method takes source and destination directory paths as parameters.

C# list drives

The Directory.GetLogicalDrives method lists the names of logical drives in the format :\.

Program.cs
string[] drives = Directory.GetLogicalDrives();

foreach (string drive in drives)
{
    System.Console.WriteLine(drive);
}

This example displays all drives on the computer.

C# list directories

The Directory.GetDirectories method returns subdirectory names, optionally matching specified criteria.

Program.cs
var docPath = Environment.GetFolderPath(Environment.SpecialFolder.MyDocuments);

string[] myDirs = Directory.GetDirectories(docPath);
Console.WriteLine("Directories:");

foreach (var myDir in myDirs)
{
    Console.WriteLine(myDir);
}

This example lists all subdirectories in the specified directory.

The next example filters directories based on specific criteria.

Program.cs
var docPath = Environment.GetFolderPath(Environment.SpecialFolder.MyDocuments);
Console.WriteLine(docPath);

string[] myDirs = Directory.GetDirectories(docPath, "w*",
        SearchOption.TopDirectoryOnly);

Console.WriteLine("Directories:");

foreach (var myDir in myDirs)
{
    Console.WriteLine(myDir);
}

This example lists directories starting with the letter w.

string[] myDirs = Directory.GetDirectories(docPath, "w*", SearchOption.TopDirectoryOnly);

The Directory.GetDirectories method accepts the directory path, a search pattern for subdirectory names, and a search option to limit to the current directory or include subdirectories.

C# list files

The Directory.GetFiles method returns file names, optionally matching specified criteria.

Program.cs
var docPath = Environment.GetFolderPath(Environment.SpecialFolder.MyDocuments);

string[] myFiles = Directory.GetFiles(docPath);
Console.WriteLine("Files:");

foreach (var myFile in myFiles)
{
    Console.WriteLine(myFile);
}

This example lists all files in the user's Documents folder.

C# directory times

The Directory.GetCreationTime method retrieves a directory's creation date and time. Directory.GetLastAccessTime gets the last access date and time, and Directory.GetLastWriteTime fetches the last write date and time.

Program.cs
var docPath = Environment.GetFolderPath(Environment.SpecialFolder.MyDocuments);

var myDir = $@"{docPath}\test";

var creationTime = Directory.GetCreationTime(myDir);
var lastAccessTime = Directory.GetLastAccessTime(myDir);
var lastWriteTime = Directory.GetLastWriteTime(myDir);

Console.WriteLine($"Creation time: {creationTime}");
Console.WriteLine($"Last access time: {lastAccessTime}");
Console.WriteLine($"Last write time: {lastWriteTime}");

This example prints the creation, last access, and last write times of the specified directory.

C# list entries

The Directory.GetFileSystemEntries method returns names of all files and subdirectories, optionally matching specified criteria.

Program.cs
var docPath = Environment.GetFolderPath(Environment.SpecialFolder.MyDocuments);

string[] entries = Directory.GetFileSystemEntries(docPath, "w*");
Console.WriteLine("Entries:");

foreach (var entry in entries)
{
    Console.WriteLine(entry);
}

This program lists all entries starting with w in the specified directory.

C# directory size

The following example calculates a directory's size.

Program.cs
var docPath = Environment.GetFolderPath(Environment.SpecialFolder.MyDocuments);
long size = 0;
var myDir = $@"{docPath}/csharp";

var dirInfo = new DirectoryInfo(myDir);

foreach (FileInfo fi in dirInfo.GetFiles("*", SearchOption.AllDirectories))
{
    size += fi.Length;
}

Console.WriteLine($"The directory size: {size} bytes");

To calculate a directory's size, we use DirectoryInfo's GetFiles method, which returns an array of FileInfo objects. The Length property of FileInfo provides each file's size.

foreach (FileInfo fi in dirInfo.GetFiles("*", SearchOption.AllDirectories))
{
    size += fi.Length;
}

We iterate through all files in the directory and its subdirectories, summing their sizes.

C# copy directory

The following example copies a directory.

Program.cs
var source = @"C:\Users\Jano\Documents\websites";
var dest = @"C:\Users\Jano\Documents\websites-2";

DirectoryCopy(source, dest, true);
Console.WriteLine("Copying finished");
        
void DirectoryCopy(string source, string dest, bool copySubDirs = true)
{
    var dir = new DirectoryInfo(source);

    if (!dir.Exists)
    {
        throw new DirectoryNotFoundException(
            $"Source directory does not exist or could not be found: {source}");
    }

    DirectoryInfo[] dirs = dir.GetDirectories();

    if (!Directory.Exists(dest))
    {
        Directory.CreateDirectory(dest);
    }

    FileInfo[] files = dir.GetFiles();

    foreach (FileInfo file in files)
    {
        string tempPath = Path.Combine(dest, file.Name);
        file.CopyTo(tempPath, false);
    }

    if (copySubDirs)
    {
        foreach (DirectoryInfo subdir in dirs)
        {
            string tempPath = Path.Combine(dest, subdir.Name);
            DirectoryCopy(subdir.FullName, tempPath, copySubDirs);
        }
    }
}

This example copies a directory and its subdirectories to a new location.

var source = @"C:\Users\Jano\Documents\websites";
var dest = @"C:\Users\Jano\Documents\websites-2";

We specify the source and destination directory paths.

DirectoryCopy(source, dest, true);

The DirectoryCopy method handles the copying, with the third parameter indicating whether to include subdirectories.

var dir = new DirectoryInfo(source);

if (!dir.Exists)
{
    throw new DirectoryNotFoundException(
        $"Source directory does not exist or could not be found: {source}");
}

We create a DirectoryInfo object for the source path and check if it exists, throwing a DirectoryNotFoundException if it does not.

DirectoryInfo[] dirs = dir.GetDirectories();

We retrieve all top-level directories using GetDirectories.

if (!Directory.Exists(dest))
{
    Directory.CreateDirectory(dest);
}

We create the destination directory if it does not exist.

FileInfo[] files = dir.GetFiles();

foreach (FileInfo file in files)
{
    string tempPath = Path.Combine(dest, file.Name);
    file.CopyTo(tempPath, false);
}

We retrieve and copy all files to the destination directory.

if (copySubDirs)
{
    foreach (DirectoryInfo subdir in dirs)
    {
        string tempPath = Path.Combine(dest, subdir.Name);
        DirectoryCopy(subdir.FullName, tempPath, copySubDirs);
    }
}

If copySubDirs is true, we recursively copy subdirectories and their contents.

C# directory access control list

An access control list (ACL) contains access control entries (ACEs). Each ACE identifies a trustee and specifies their allowed, denied, or audited access rights.

The DirectoryInfo.GetAccessControl method retrieves the ACL entries for a directory.

$ dotnet add package System.IO.FileSystem.AccessControl

We must include the System.IO.FileSystem.AccessControl package.

Program.cs
using System.Security.AccessControl;

var docPath = Environment.GetFolderPath(Environment.SpecialFolder.MyDocuments);
var myDir = $@"{docPath}\test";

var dirInfo = new DirectoryInfo(myDir);
DirectorySecurity dSecurity = dirInfo.GetAccessControl();
AuthorizationRuleCollection acl = dSecurity.GetAccessRules(true, true,
    typeof(System.Security.Principal.NTAccount));

foreach (FileSystemAccessRule ace in acl)
{
    Console.WriteLine("Account: {0}", ace.IdentityReference.Value);
    Console.WriteLine("Type: {0}", ace.AccessControlType);
    Console.WriteLine("Rights: {0}", ace.FileSystemRights);
    Console.WriteLine("Inherited: {0}", ace.IsInherited);

    Console.WriteLine("------------------------");
}

This example displays the ACL for the specified directory.

var dirInfo = new DirectoryInfo(myDir);

We create a DirectoryInfo object for the directory.

DirectorySecurity dSecurity = dirInfo.GetAccessControl();

The GetAccessControl method returns a DirectorySecurity object containing the directory's access control rules.

AuthorizationRuleCollection acl = dSecurity.GetAccessRules(true, true,
        typeof(System.Security.Principal.NTAccount));

We obtain a collection of security rules using GetAccessRules.

foreach (FileSystemAccessRule ace in acl)
{
    Console.WriteLine("Account: {0}", ace.IdentityReference.Value);
    Console.WriteLine("Type: {0}", ace.AccessControlType);
    Console.WriteLine("Rights: {0}", ace.FileSystemRights);
    Console.WriteLine("Inherited: {0}", ace.IsInherited);

    Console.WriteLine("------------------------");
}

We iterate through the access control rules and display them.

Source

Directory class - language reference

This article explored working with directories in C#.

Author

I am Jan Bodnar, a passionate programmer with extensive experience. I have been writing programming articles since 2007, authoring over 1,400 articles and 8 e-books. I have more than ten years of experience teaching programming.

List all C# tutorials.