Skip to main content

C# Directory Class

Introduction

The Directory class is an essential tool in C#'s file handling capabilities, provided by the System.IO namespace. It offers static methods for creating, moving, and manipulating directories (folders) within the file system. Understanding how to work with directories is crucial for many applications, from simple file organization to complex data storage systems.

In this tutorial, you'll learn how to:

  • Create and delete directories
  • Check if directories exist
  • Get information about directories
  • Move and copy directories
  • List files and subdirectories

Let's explore how the Directory class can help you manage folders in your C# applications!

Getting Started with the Directory Class

To use the Directory class, you first need to include the System.IO namespace in your C# program:

csharp
using System;
using System.IO;

class Program
{
static void Main(string[] args)
{
// Directory operations will be performed here
}
}

Basic Directory Operations

Checking if a Directory Exists

Before performing operations on a directory, it's often necessary to check if it exists:

csharp
string path = @"C:\MyFolder";

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

Creating a Directory

To create a new directory, use the CreateDirectory method:

csharp
string path = @"C:\MyFolder";

try
{
// Create the directory
Directory.CreateDirectory(path);
Console.WriteLine($"Directory created at {path}");
}
catch (Exception ex)
{
Console.WriteLine($"Error creating directory: {ex.Message}");
}

The CreateDirectory method creates all directories in the specified path, including any necessary parent directories. If the directory already exists, this method does nothing (it won't throw an error).

Deleting a Directory

To remove a directory, use the Delete method:

csharp
string path = @"C:\MyFolder";

try
{
// Delete the directory
Directory.Delete(path);
Console.WriteLine($"Directory deleted at {path}");
}
catch (Exception ex)
{
Console.WriteLine($"Error deleting directory: {ex.Message}");
}

By default, the directory must be empty to be deleted. To remove a directory and all its contents (files and subdirectories), use the overloaded version with recursive parameter:

csharp
// Delete directory and all its contents
Directory.Delete(path, recursive: true);

Getting Directory Information

Getting the Current Directory

To retrieve the current working directory of your application:

csharp
string currentDirectory = Directory.GetCurrentDirectory();
Console.WriteLine($"Current directory: {currentDirectory}");

Getting the Creation Time

You can retrieve when a directory was created:

csharp
string path = @"C:\MyFolder";
DateTime creationTime = Directory.GetCreationTime(path);
Console.WriteLine($"Directory created on: {creationTime}");

There are similar methods for other time-related information:

  • GetLastAccessTime(): Returns when the directory was last accessed
  • GetLastWriteTime(): Returns when the directory was last modified

Getting the Parent Directory

To get the parent directory:

csharp
string path = @"C:\MyFolder\SubFolder";
string parentDirectory = Directory.GetParent(path).FullName;
Console.WriteLine($"Parent directory: {parentDirectory}");

Getting Directory Root

To determine the root directory:

csharp
string path = @"C:\MyFolder\SubFolder";
string rootDirectory = Directory.GetDirectoryRoot(path);
Console.WriteLine($"Root directory: {rootDirectory}"); // Outputs: C:\

Working with Files and Subdirectories

Listing Files in a Directory

To get all files in a directory:

csharp
string path = @"C:\MyFolder";

try
{
string[] files = Directory.GetFiles(path);

Console.WriteLine("Files in directory:");
foreach (string file in files)
{
Console.WriteLine(file);
}
}
catch (Exception ex)
{
Console.WriteLine($"Error accessing directory: {ex.Message}");
}

You can also filter files using search patterns:

csharp
// Get only text files
string[] textFiles = Directory.GetFiles(path, "*.txt");

// Get all Excel files
string[] excelFiles = Directory.GetFiles(path, "*.xlsx");

Listing Subdirectories

To get all subdirectories:

csharp
string path = @"C:\MyFolder";

try
{
string[] subdirectories = Directory.GetDirectories(path);

Console.WriteLine("Subdirectories:");
foreach (string directory in subdirectories)
{
Console.WriteLine(directory);
}
}
catch (Exception ex)
{
Console.WriteLine($"Error accessing directory: {ex.Message}");
}

Searching with Patterns and Options

You can use advanced search patterns and search options:

csharp
// Search all directories, including subdirectories
string[] allTextFiles = Directory.GetFiles(path, "*.txt", SearchOption.AllDirectories);

// Search only the top directory
string[] topLevelTextFiles = Directory.GetFiles(path, "*.txt", SearchOption.TopDirectoryOnly);

Moving and Copying Directories

While the Directory class itself doesn't have built-in methods for moving or copying entire directories, you can use the Directory.CreateDirectory method in conjunction with other methods to achieve this functionality.

For copying directories, you typically need to:

  1. Create the destination directory
  2. Copy all files
  3. Recursively copy subdirectories

Here's a helper method to copy directories:

csharp
static void CopyDirectory(string sourceDir, string destinationDir)
{
// Create the destination directory
Directory.CreateDirectory(destinationDir);

// Get the files in the source directory and copy to the destination directory
foreach (string file in Directory.GetFiles(sourceDir))
{
string fileName = Path.GetFileName(file);
string destFile = Path.Combine(destinationDir, fileName);
File.Copy(file, destFile, true);
}

// Copy subdirectories recursively
foreach (string subdir in Directory.GetDirectories(sourceDir))
{
string subdirName = Path.GetFileName(subdir);
string destSubDir = Path.Combine(destinationDir, subdirName);
CopyDirectory(subdir, destSubDir);
}
}

To use this method:

csharp
string sourceDirectory = @"C:\SourceFolder";
string destinationDirectory = @"C:\DestinationFolder";

try
{
CopyDirectory(sourceDirectory, destinationDirectory);
Console.WriteLine("Directory copied successfully!");
}
catch (Exception ex)
{
Console.WriteLine($"Error copying directory: {ex.Message}");
}

Practical Example: Directory Backup Utility

Let's combine what we've learned to create a simple backup utility that copies files from a source directory to a backup directory, maintaining the folder structure:

csharp
using System;
using System.IO;

class BackupUtility
{
static void Main(string[] args)
{
string sourceDirectory = @"C:\ImportantFiles";
string backupDirectory = @"C:\Backup\ImportantFiles_" + DateTime.Now.ToString("yyyy-MM-dd_HH-mm-ss");

try
{
// Check if source directory exists
if (!Directory.Exists(sourceDirectory))
{
Console.WriteLine("Source directory does not exist!");
return;
}

// Create backup directory
Directory.CreateDirectory(backupDirectory);
Console.WriteLine($"Created backup directory: {backupDirectory}");

// Perform the backup
int filesCopied = BackupDirectory(sourceDirectory, backupDirectory);

Console.WriteLine($"Backup completed successfully! {filesCopied} files copied.");
}
catch (Exception ex)
{
Console.WriteLine($"Error during backup: {ex.Message}");
}
}

static int BackupDirectory(string sourceDir, string destinationDir)
{
int count = 0;

// Create the destination directory if it doesn't exist
Directory.CreateDirectory(destinationDir);

// Copy all files
foreach (string file in Directory.GetFiles(sourceDir))
{
string fileName = Path.GetFileName(file);
string destFile = Path.Combine(destinationDir, fileName);
File.Copy(file, destFile, true);
count++;
Console.WriteLine($"Copied: {fileName}");
}

// Copy all subdirectories recursively
foreach (string subdir in Directory.GetDirectories(sourceDir))
{
string subdirName = Path.GetFileName(subdir);
string destSubDir = Path.Combine(destinationDir, subdirName);
count += BackupDirectory(subdir, destSubDir);
}

return count;
}
}

This backup utility creates a timestamped backup folder and copies all files and subdirectories from the source directory while maintaining the original folder structure.

Summary

The Directory class in C# provides powerful tools for managing directories in your file system:

  • Creating and deleting directories with CreateDirectory() and Delete()
  • Checking directory existence with Exists()
  • Getting directory information with methods like GetCreationTime() and GetCurrentDirectory()
  • Navigating directory structures with GetParent() and GetDirectoryRoot()
  • Listing files and subdirectories with GetFiles() and GetDirectories()

While the class doesn't directly support copying directories as a single operation, you can write helper methods to accomplish this by recursively copying files and subdirectories.

Remember to always handle exceptions when working with file system operations, as they can fail for various reasons like insufficient permissions, locked files, or network issues.

Additional Resources

Practice Exercises

  1. Create a program that lists all files of a specific type (e.g., .txt, .jpg) in a directory and its subdirectories.
  2. Write a utility that monitors a directory for changes and logs when files are added, modified, or deleted.
  3. Create a directory cleanup tool that removes empty directories from a specified location.
  4. Build a folder size calculator that computes the total size of a directory by summing the sizes of all contained files.
  5. Implement a simple file synchronization tool that ensures two directories contain the same files and subdirectories.


If you spot any mistakes on this website, please let me know at [email protected]. I’d greatly appreciate your feedback! :)