On this page
File I/O
The System.IO namespace provides classes for file system operations, streams, and path manipulation.
Writing and Reading Text
using System.IO;
string path = "data.txt";
// Write
await File.WriteAllTextAsync(path, "Hello, C# I/O!\nLine 2");
// Read
string content = await File.ReadAllTextAsync(path);
Console.WriteLine(content);
// Append
await File.AppendAllTextAsync(path, "\nAppended line");
StreamReader and StreamWriter
using (var writer = new StreamWriter("log.txt"))
{
await writer.WriteLineAsync("Entry 1");
await writer.WriteLineAsync("Entry 2");
}
using (var reader = new StreamReader("log.txt"))
{
string? line;
while ((line = await reader.ReadLineAsync()) != null)
Console.WriteLine(line);
}
Working with Directories
string dir = "my_folder";
if (!Directory.Exists(dir))
Directory.CreateDirectory(dir);
string[] files = Directory.GetFiles(dir, "*.txt");
foreach (string file in files)
Console.WriteLine(Path.GetFileName(file));
Path Operations
string combined = Path.Combine("docs", "readme.md");
string fileName = Path.GetFileName("/users/alice/report.pdf"); // report.pdf
string ext = Path.GetExtension("photo.jpg"); // .jpg
string fullPath = Path.GetFullPath("./config.json");
JSON Serialization
using System.Text.Json;
var user = new { Name = "Alice", Age = 30 };
string json = JsonSerializer.Serialize(user, new JsonSerializerOptions
{
WriteIndented = true
});
await File.WriteAllTextAsync("user.json", json);
string loaded = await File.ReadAllTextAsync("user.json");
var parsed = JsonSerializer.Deserialize<Dictionary<string, JsonElement>>(loaded);
Binary Files with FileStream
byte[] data = { 0x48, 0x65, 0x6C, 0x6C, 0x6F }; // "Hello"
await using var fs = new FileStream("binary.dat", FileMode.Create);
await fs.WriteAsync(data);
Prefer async I/O methods in ASP.NET and other server applications to avoid blocking threads.
FileInfo and DirectoryInfo
var file = new FileInfo("data.txt");
Console.WriteLine($"Size: {file.Length} bytes");
Console.WriteLine($"Created: {file.CreationTimeUtc}");
var dir = new DirectoryInfo("logs");
foreach (var log in dir.GetFiles("*.log").OrderByDescending(f => f.LastWriteTime))
Console.WriteLine(log.Name);
Copying and Moving Files
File.Copy("source.txt", "backup/source.txt", overwrite: true);
File.Move("old-name.txt", "new-name.txt");
Directory.CreateDirectory("archive/2024");
Reading Lines Efficiently
await foreach (var line in File.ReadLinesAsync("large-file.log"))
{
if (line.Contains("ERROR"))
Console.WriteLine(line);
}
ReadLinesAsync streams lines without loading the entire file into memory.
Custom JSON Options
var options = new JsonSerializerOptions
{
PropertyNamingPolicy = JsonNamingPolicy.CamelCase,
WriteIndented = true,
DefaultIgnoreCondition = JsonIgnoreCondition.WhenWritingNull
};
var json = JsonSerializer.Serialize(user, options);
var user = JsonSerializer.Deserialize<User>(json, options);
Exception Handling for I/O
try
{
var text = await File.ReadAllTextAsync(path);
}
catch (FileNotFoundException)
{
Console.WriteLine($"File not found: {path}");
}
catch (UnauthorizedAccessException)
{
Console.WriteLine("Access denied");
}