Skip to main content

Files and Folders

warning

This document has been translated using machine translation without human review.

How to combine path components?

Console.WriteLine(Path.Combine("C:\\", "Windows", "System32"));
// Output: C:\Windows\System32

How to normalize slashes in a path?

public static string NormalizePath(string path) 
{
return path.Replace('/', Path.DirectorySeparatorChar).Replace('\\', Path.DirectorySeparatorChar);
}

How to get the current working directory?

Console.WriteLine(Directory.GetCurrentDirectory());

How to get an absolute path from a relative one?

Console.WriteLine(Path.GetFullPath("aleksey/projects/foo"));

How to check if a folder exists?

var exists = Directory.Exists(path);

Console.WriteLine($"Folder exists: {exists}");

// only for specialists
if (exists)
{
Console.WriteLine("Could have done something useful!");
}
else
{
Console.WriteLine("What about mom?");
}

How to check if a file exists?

Console.WriteLine($"File exists: {File.Exists(path)}");

How to get a list of folders?

foreach (var dir in Directory.GetDirectories(path))
{
Console.WriteLine(dir);
}

How to get a list of files in a folder?

List of all files in the specified folder
var files = Directory.GetFiles(path);

foreach (var file in files)
{
Console.WriteLine(file);
}
Recursively by specified pattern
var path = Directory.GetCurrentDirectory();
var pattern = "*.md";
var files = Directory.GetFiles(path, pattern, SearchOption.AllDirectories);

foreach (var file in files)
{
Console.WriteLine(file);
}
Gradual retrieval when there are very many files
var path = "C:\\Windows";
var pattern = "*.dll";
var files = Directory.EnumerateFiles(path, pattern, SearchOption.AllDirectories);

foreach (var file in files)
{
Console.WriteLine(file);
}

How to create a folder?

Directory.CreateDirectory(path);

How to delete a folder?

Directory.Delete(path);
// recursively
Directory.Delete(path, true);

How to copy a folder?

public static void CopyDirectory(string sourceDirectory, string destinationDirectory) 
{
Directory.CreateDirectory(destinationDirectory);

foreach (var file in Directory.GetFiles(sourceDirectory))
{
var destFile = Path.Combine(destinationDirectory, Path.GetFileName(file));
File.Copy(file, destFile);
}

foreach (var directory in Directory.GetDirectories(sourceDirectory))
{
var nextDestinationDirectory = Path.Combine(destinationDirectory, Path.GetFileName(directory));
CopyDirectory(directory, nextDestinationDirectory);
}
}

How to move a folder?

Directory.Move(sourceDirName, destDirName);

How to create (overwrite) a text file?

Lazy option for overwriting a text file
File.WriteAllText(path, content, Encoding.UTF8);

The lazy option is simple but can lead to file locks. It's better to fully control this process.

Correct option for overwriting a text file
using (var fileStream = new FileStream(path, FileMode.Create, FileAccess.Write, FileShare.None))
{
using (var writer = new StreamWriter(fileStream, Encoding.UTF8))
{
writer.Write(content);
}
}

How to append data to the end of a text file?

Lazy option for appending data to a text file
File.AppendAllText(path, content, Encoding.UTF8);
Lazily append a line to the end of a text file
File.AppendAllLines(path, [line], Encoding.UTF8);
Correct option for appending data to a text file
using (var fileStream = new FileStream(path, FileMode.Append, FileAccess.Write, FileShare.None))
{
using (var writer = new StreamWriter(fileStream, Encoding.UTF8))
{
writer.Write(content);
}
}

How to read a text file?

Lazy option for reading a text file
Console.WriteLine(File.ReadAllText(path));

The lazy option can lead to file locks, it's better to control the entire file handling process yourself.

Correct option for reading a text file
using (var fileStream = new FileStream(path, FileMode.Open, FileAccess.Read, FileShare.Read))
{
using (var reader = new StreamReader(fileStream, Encoding.UTF8))
{
Console.WriteLine(reader.ReadToEnd());
}
}

How to read a binary file?

Lazy option for reading a binary file
var bytes = File.ReadAllBytes(path);
Correct option for reading a binary file
using (var fileStream = new FileStream(path, FileMode.Open, FileAccess.Read, FileShare.Read))
{
using (var reader = new BinaryReader(fileStream))
{
var bytes = reader.ReadBytes((int)fileStream.Length);
}
}
Gradual reading of a binary file
using (var fileStream = new FileStream(path, FileMode.Open, FileAccess.Read, FileShare.Read))
{
int bufferSize = 2048;
int bytesRead;
var buffer = new byte[bufferSize];

while ((bytesRead = fileStream.Read(buffer, 0, bufferSize)) > 0)
{
var content = string.Join("", buffer.Take(bytesRead).Select(b => b.ToString("x2")));
Console.WriteLine($"Read packet of {bytesRead} bytes: {content}");
}
}

How to copy a file?

File.Copy(sourcePath, destinationPath);

How to move a file?

File.Move(sourcePath, destinationPath);

How to delete a file?

Regular file deletion
File.Delete(path);
Attempt to delete a file
public static async Task DeleteFileAsync(
string path,
TimeSpan? accessTimeout = null,
CancellationToken cancellationToken = default
)
{
var totalTime = new TimeSpan();
var interval = TimeSpan.FromMilliseconds(100);

accessTimeout ??= TimeSpan.FromSeconds(5);

while (File.Exists(path))
{
try
{
File.Delete(path);
}
catch (IOException)
{
await Task.Delay(interval, cancellationToken);
totalTime += interval;

if (totalTime > accessTimeout)
{
throw;
}
}
}
}