ZetCode

C# FileInfo

last modified April 20, 2025

This tutorial explains how to use the FileInfo class in C# to get detailed information about files. FileInfo provides properties and methods for file manipulation and metadata access.

The FileInfo class provides instance methods for creating, copying, deleting, moving, and opening files. It helps in getting file properties like size, creation time, and attributes.

FileInfo is part of the System.IO namespace. Unlike the static File class, FileInfo works with specific file instances. It offers better performance for multiple operations on the same file.

Basic FileInfo Example

This example demonstrates how to create a FileInfo object and access basic file properties. We'll display information about a sample file.

Program.cs
using System;
using System.IO;

class Program
{
    static void Main()
    {
        string filePath = "example.txt";
        File.WriteAllText(filePath, "This is sample text.");
        
        FileInfo fileInfo = new FileInfo(filePath);
        
        Console.WriteLine($"File Name: {fileInfo.Name}");
        Console.WriteLine($"Full Path: {fileInfo.FullName}");
        Console.WriteLine($"Size (bytes): {fileInfo.Length}");
        Console.WriteLine($"Created: {fileInfo.CreationTime}");
        Console.WriteLine($"Last Modified: {fileInfo.LastWriteTime}");
        Console.WriteLine($"Attributes: {fileInfo.Attributes}");
    }
}

The program creates a sample file and then uses FileInfo to display its properties. FileInfo provides detailed metadata about the file without needing to open it. The Name property returns just the file name, while FullName gives the complete path.

Length shows the file size in bytes, and the time-related properties provide creation and modification timestamps. The Attributes property returns flags indicating file characteristics like read-only, hidden, or system file status.

Checking File Existence and Properties

FileInfo helps verify file existence and check specific properties before performing operations. This example demonstrates these capabilities.

Program.cs
using System;
using System.IO;

class Program
{
    static void Main()
    {
        string filePath = "testfile.dat";
        
        FileInfo fileInfo = new FileInfo(filePath);
        
        Console.WriteLine($"File exists: {fileInfo.Exists}");
        
        if (!fileInfo.Exists)
        {
            using (File.Create(filePath)) { }
            Console.WriteLine("File created.");
        }
        
        Console.WriteLine($"Is read-only: {fileInfo.IsReadOnly}");
        Console.WriteLine($"Extension: {fileInfo.Extension}");
        Console.WriteLine($"Directory: {fileInfo.DirectoryName}");
    }
}

The Exists property checks if the file is present. If not, we create it. The IsReadOnly property indicates if the file has the read-only attribute set. Extension returns the file extension, and DirectoryName provides the full path of the containing directory.

This example shows how to safely check file status before operations. The File.Create method is used to create the file if it doesn't exist. All properties automatically update after file creation.

Copying and Moving Files

FileInfo provides methods for copying and moving files. This example demonstrates file operations with proper error handling.

Program.cs
using System;
using System.IO;

class Program
{
    static void Main()
    {
        string sourceFile = "original.txt";
        string copyFile = "copy.txt";
        string moveFile = "moved.txt";
        
        File.WriteAllText(sourceFile, "Important content");
        
        FileInfo fileInfo = new FileInfo(sourceFile);
        
        try
        {
            // Copy the file
            fileInfo.CopyTo(copyFile, overwrite: true);
            Console.WriteLine("File copied successfully.");
            
            // Move the file
            fileInfo.MoveTo(moveFile);
            Console.WriteLine("File moved successfully.");
            
            // Verify operations
            Console.WriteLine($"Original exists: {File.Exists(sourceFile)}");
            Console.WriteLine($"Copy exists: {File.Exists(copyFile)}");
            Console.WriteLine($"Moved exists: {File.Exists(moveFile)}");
        }
        catch (IOException ex)
        {
            Console.WriteLine($"File operation failed: {ex.Message}");
        }
    }
}

CopyTo creates a duplicate of the file, with an option to overwrite existing files. MoveTo relocates the file to a new location. Both methods throw IOException if operations fail.

The example includes proper error handling for file operations. After moving, the original file no longer exists at its initial location. The overwrite parameter in CopyTo prevents exceptions when the target file exists.

File Deletion and Attributes

This example shows how to delete files and modify file attributes using FileInfo. We'll demonstrate changing the read-only attribute.

Program.cs
using System;
using System.IO;

class Program
{
    static void Main()
    {
        string filePath = "tempfile.txt";
        File.WriteAllText(filePath, "Temporary content");
        
        FileInfo fileInfo = new FileInfo(filePath);
        
        // Set file to read-only
        fileInfo.Attributes |= FileAttributes.ReadOnly;
        Console.WriteLine($"Is read-only: {fileInfo.IsReadOnly}");
        
        try
        {
            // Attempt to delete (will fail)
            fileInfo.Delete();
            Console.WriteLine("File deleted.");
        }
        catch (UnauthorizedAccessException)
        {
            Console.WriteLine("Cannot delete read-only file.");
            
            // Remove read-only attribute
            fileInfo.Attributes &= ~FileAttributes.ReadOnly;
            fileInfo.Delete();
            Console.WriteLine("Read-only removed and file deleted.");
        }
    }
}

The Attributes property allows modifying file characteristics. We set the read-only flag using bitwise OR operation. Attempting to delete a read-only file throws UnauthorizedAccessException.

After handling the exception, we remove the read-only attribute using bitwise AND with the complement of FileAttributes.ReadOnly. The file can then be successfully deleted with the Delete method.

File Information with Refresh

FileInfo caches file information. This example shows when to use the Refresh method to get updated file details.

Program.cs
using System;
using System.IO;
using System.Threading;

class Program
{
    static void Main()
    {
        string filePath = "dynamic.txt";
        File.WriteAllText(filePath, "Initial content");
        
        FileInfo fileInfo = new FileInfo(filePath);
        Console.WriteLine($"Initial size: {fileInfo.Length} bytes");
        
        // Simulate external file modification
        Thread.Sleep(2000);
        File.AppendAllText(filePath, "\nAdditional content");
        
        // Display cached size (incorrect)
        Console.WriteLine($"Cached size: {fileInfo.Length} bytes");
        
        // Refresh and get current size
        fileInfo.Refresh();
        Console.WriteLine($"Refreshed size: {fileInfo.Length} bytes");
    }
}

FileInfo properties are cached after the first access. If the file changes externally, call Refresh to update the cached information. The example shows how file size remains cached until explicitly refreshed.

After modifying the file externally, the Length property returns the old value. Calling Refresh forces FileInfo to re-read the file metadata from disk, providing accurate current information.

Directory Information with FileInfo

FileInfo provides access to directory information through its properties. This example explores directory-related functionality.

Program.cs
using System;
using System.IO;

class Program
{
    static void Main()
    {
        string filePath = Path.Combine("docs", "report.pdf");
        Directory.CreateDirectory("docs");
        File.WriteAllText(filePath, "PDF content");
        
        FileInfo fileInfo = new FileInfo(filePath);
        
        Console.WriteLine($"Directory: {fileInfo.DirectoryName}");
        Console.WriteLine($"Directory Info:");
        
        DirectoryInfo dirInfo = fileInfo.Directory;
        Console.WriteLine($"  Full Path: {dirInfo.FullName}");
        Console.WriteLine($"  Created: {dirInfo.CreationTime}");
        Console.WriteLine($"  Files Count: {dirInfo.GetFiles().Length}");
    }
}

The DirectoryName property returns the full path of the containing directory. The Directory property provides a DirectoryInfo object for more detailed directory operations.

This example creates a nested directory structure and a file within it. The DirectoryInfo object allows accessing directory properties and listing files. The GetFiles method returns all files in the directory.

File Stream Operations

FileInfo provides methods for creating file streams. This example demonstrates reading and writing using FileInfo stream methods.

Program.cs
using System;
using System.IO;
using System.Text;

class Program
{
    static void Main()
    {
        string filePath = "data.bin";
        FileInfo fileInfo = new FileInfo(filePath);
        
        // Write to file using FileInfo
        using (FileStream fs = fileInfo.Create())
        {
            byte[] data = Encoding.UTF8.GetBytes("Binary data content");
            fs.Write(data, 0, data.Length);
            Console.WriteLine("File created and written.");
        }
        
        // Read from file using FileInfo
        using (FileStream fs = fileInfo.OpenRead())
        {
            byte[] buffer = new byte[fs.Length];
            fs.Read(buffer, 0, buffer.Length);
            string content = Encoding.UTF8.GetString(buffer);
            Console.WriteLine($"File content: {content}");
        }
    }
}

The Create method returns a writable FileStream for new files. OpenRead provides a read-only stream for existing files. Both methods properly handle file resources when used with using statements.

This example writes binary data to a file and reads it back. The FileStream methods work with byte arrays, requiring encoding for text data. FileInfo's stream methods offer more control than simple File class methods.

Source

FileInfo Class Documentation

This tutorial covered using the FileInfo class in C# for file operations, including properties, copying, moving, attributes, and stream access.

Author

My name is Jan Bodnar, and I am a passionate programmer with extensive programming experience. I have been writing programming articles since 2007. To date, I have authored over 1,400 articles and 8 e-books. I possess more than ten years of experience in teaching programming.

List all C# tutorials.