ZetCode

C# FileInfo

最后修改于 2025 年 4 月 20 日

本教程解释如何在 C# 中使用 FileInfo 类来获取有关文件的详细信息。 FileInfo 提供了文件操作和元数据访问的属性和方法。

FileInfo 类提供了创建、复制、删除、移动和打开文件的实例方法。 它有助于获取文件属性,如大小、创建时间和属性。

FileInfoSystem.IO 命名空间的一部分。 与静态 File 类不同,FileInfo 适用于特定的文件实例。 对于对同一文件进行多次操作,它提供了更好的性能。

基本 FileInfo 示例

此示例演示如何创建 FileInfo 对象并访问基本文件属性。 我们将显示有关示例文件的信息。

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

该程序创建一个示例文件,然后使用 FileInfo 显示其属性。 FileInfo 提供了有关文件的详细元数据,而无需打开它。 Name 属性仅返回文件名,而 FullName 属性提供完整的路径。

Length 显示文件大小(以字节为单位),并且与时间相关的属性提供创建和修改时间戳。 Attributes 属性返回指示文件特征的标志,例如只读、隐藏或系统文件状态。

检查文件是否存在和属性

FileInfo 有助于在执行操作之前验证文件是否存在并检查特定属性。 此示例演示了这些功能。

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

Exists 属性检查文件是否存在。 如果不存在,我们创建它。 IsReadOnly 属性指示文件是否设置了只读属性。 Extension 返回文件扩展名,而 DirectoryName 提供包含目录的完整路径。

此示例显示了如何在操作之前安全地检查文件状态。 File.Create 方法用于在文件不存在时创建文件。 创建文件后,所有属性都会自动更新。

复制和移动文件

FileInfo 提供了复制和移动文件的方法。 此示例演示了使用适当的错误处理进行文件操作。

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 创建文件的副本,并可以选择覆盖现有文件。 MoveTo 将文件重定位到新位置。 如果操作失败,这两种方法都会抛出 IOException

该示例包括对文件操作的适当错误处理。 移动后,原始文件不再存在于其初始位置。 CopyTo 中的 overwrite 参数可防止目标文件存在时出现异常。

文件删除和属性

此示例显示如何使用 FileInfo 删除文件和修改文件属性。 我们将演示如何更改只读属性。

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

Attributes 属性允许修改文件特征。 我们使用按位 OR 运算设置只读标志。 尝试删除只读文件会抛出 UnauthorizedAccessException

在处理异常后,我们使用按位 AND 运算和 FileAttributes.ReadOnly 的补码来删除只读属性。 然后可以使用 Delete 方法成功删除该文件。

使用刷新获取文件信息

FileInfo 缓存文件信息。 此示例显示何时使用 Refresh 方法来获取更新后的文件详细信息。

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 属性在第一次访问后会被缓存。 如果文件在外部发生更改,请调用 Refresh 以更新缓存的信息。 该示例显示了文件大小如何保持缓存状态,直到显式刷新为止。

在外部修改文件后,Length 属性返回旧值。 调用 Refresh 会强制 FileInfo 从磁盘重新读取文件元数据,从而提供准确的当前信息。

使用 FileInfo 获取目录信息

FileInfo 提供了通过其属性访问目录信息的功能。 此示例探讨了与目录相关的功能。

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

DirectoryName 属性返回包含目录的完整路径。 Directory 属性提供了 DirectoryInfo 对象,用于更详细的目录操作。

此示例创建一个嵌套的目录结构以及其中的一个文件。 DirectoryInfo 对象允许访问目录属性和列出文件。 GetFiles 方法返回目录中的所有文件。

文件流操作

FileInfo 提供了用于创建文件流的方法。 此示例演示了使用 FileInfo 流方法进行读取和写入。

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

Create 方法返回一个可写的 FileStream,用于新文件。 OpenRead 为现有文件提供只读流。 当与 using 语句一起使用时,这两种方法都会正确处理文件资源。

此示例将二进制数据写入文件并将其读回。 FileStream 方法使用字节数组,需要对文本数据进行编码。 与简单的 File 类方法相比,FileInfo 的流方法提供了更多的控制。

来源

FileInfo 类文档

本教程介绍了如何在 C# 中使用 FileInfo 类进行文件操作,包括属性、复制、移动、属性和流访问。

作者

我叫 Jan Bodnar,是一位充满热情的程序员,拥有丰富的编程经验。 自 2007 年以来,我一直在撰写编程文章。 到目前为止,我已经撰写了 1,400 多篇文章和 8 本电子书。 我拥有超过十年的编程教学经验。

列出所有 C# 教程