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");
}