File Handling in C#

Intermediate 25 min read Lesson 4 of 4

Introduction to File Handling

C# provides powerful file handling capabilities through the System.IO namespace. You can read, write, and manipulate files easily.

Basic File Operations

Writing to a File

using System.IO;

// Method 1: Using File.WriteAllText (overwrites file)
File.WriteAllText("example.txt", "Hello World!");

// Method 2: Using File.AppendAllText (adds to file)
File.AppendAllText("example.txt", "\nThis is appended text.");

// Method 3: Using StreamWriter
using (StreamWriter writer = new StreamWriter("example.txt"))
{
    writer.WriteLine("Line 1");
    writer.WriteLine("Line 2");
    writer.WriteLine("Line 3");
}

Reading from a File

// Method 1: Read all text at once
string content = File.ReadAllText("example.txt");
Console.WriteLine(content);

// Method 2: Read all lines into array
string[] lines = File.ReadAllLines("example.txt");
foreach (string line in lines)
    Console.WriteLine(line);

// Method 3: Using StreamReader
using (StreamReader reader = new StreamReader("example.txt"))
{
    string line;
    while ((line = reader.ReadLine()) != null)
        Console.WriteLine(line);
}

File Operations Example

using System;
using System.IO;

class FileManager
{
    public static void CreateFile(string path, string content)
    {
        File.WriteAllText(path, content);
        Console.WriteLine($"File created: {path}");
    }
    
    public static void AppendToFile(string path, string content)
    {
        File.AppendAllText(path, content + "\n");
        Console.WriteLine($"Content appended to: {path}");
    }
    
    public static void ReadFile(string path)
    {
        if (File.Exists(path))
        {
            string content = File.ReadAllText(path);
            Console.WriteLine($"Content of {path}:");
            Console.WriteLine(content);
        }
        else
        {
            Console.WriteLine($"File not found: {path}");
        }
    }
    
    public static void CopyFile(string source, string destination)
    {
        if (File.Exists(source))
        {
            File.Copy(source, destination, true);
            Console.WriteLine($"File copied from {source} to {destination}");
        }
        else
        {
            Console.WriteLine($"Source file not found: {source}");
        }
    }
    
    public static void DeleteFile(string path)
    {
        if (File.Exists(path))
        {
            File.Delete(path);
            Console.WriteLine($"File deleted: {path}");
        }
        else
        {
            Console.WriteLine($"File not found: {path}");
        }
    }
}

class Program
{
    static void Main()
    {
        string filePath = "data.txt";
        
        // Create file
        FileManager.CreateFile(filePath, "This is the initial content.");
        
        // Append content
        FileManager.AppendToFile(filePath, "Appended line 1");
        FileManager.AppendToFile(filePath, "Appended line 2");
        
        // Read file
        FileManager.ReadFile(filePath);
        
        // Copy file
        FileManager.CopyFile(filePath, "backup.txt");
        
        // Delete file
        FileManager.DeleteFile("backup.txt");
    }
}

Working with Directories

using System.IO;

// Create directory
Directory.CreateDirectory("MyFolder");

// Get all files in directory
string[] files = Directory.GetFiles(".");
foreach (string file in files)
    Console.WriteLine(file);

// Get all subdirectories
string[] directories = Directory.GetDirectories(".");
foreach (string dir in directories)
    Console.WriteLine(dir);

// Check if directory exists
if (Directory.Exists("MyFolder"))
    Console.WriteLine("Folder exists!");

// Delete directory
Directory.Delete("MyFolder", true); // true for recursive delete

File Information

using System.IO;

FileInfo fileInfo = new FileInfo("example.txt");
Console.WriteLine($"Name: {fileInfo.Name}");
Console.WriteLine($"Full Name: {fileInfo.FullName}");
Console.WriteLine($"Size: {fileInfo.Length} bytes");
Console.WriteLine($"Created: {fileInfo.CreationTime}");
Console.WriteLine($"Modified: {fileInfo.LastWriteTime}");
Console.WriteLine($"Read-Only: {fileInfo.IsReadOnly}");

// Change file attributes
fileInfo.Attributes = FileAttributes.Normal;
Best Practices
  • Always use try-catch blocks for file operations
  • Use using statements for StreamReader/Writer
  • Check if files/directories exist before operations
  • Handle exceptions gracefully
  • Use Path.Combine for path operations

Reading CSV Files

using System.IO;
using System.Linq;

// Read CSV file
var lines = File.ReadAllLines("data.csv");
foreach (var line in lines)
{
    var values = line.Split(',');
    Console.WriteLine($"Name: {values[0]}, Age: {values[1]}, City: {values[2]}");
}
Key Takeaway

File handling is essential for data persistence. Master the System.IO namespace to read, write, and manage files effectively.

Exercise

Create a console application that:

  1. Reads a CSV file with student data (Name, Score, Grade)
  2. Calculates the average score
  3. Writes the results to a new text file
  4. Handles file not found errors gracefully
Test Your Knowledge - Take Quiz