C# FileInfo
最后修改于 2025 年 4 月 20 日
本教程解释如何在 C# 中使用 FileInfo 类来获取有关文件的详细信息。 FileInfo 提供了文件操作和元数据访问的属性和方法。
FileInfo 类提供了创建、复制、删除、移动和打开文件的实例方法。 它有助于获取文件属性,如大小、创建时间和属性。
FileInfo 是 System.IO 命名空间的一部分。 与静态 File 类不同,FileInfo 适用于特定的文件实例。 对于对同一文件进行多次操作,它提供了更好的性能。
基本 FileInfo 示例
此示例演示如何创建 FileInfo 对象并访问基本文件属性。 我们将显示有关示例文件的信息。
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 有助于在执行操作之前验证文件是否存在并检查特定属性。 此示例演示了这些功能。
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 提供了复制和移动文件的方法。 此示例演示了使用适当的错误处理进行文件操作。
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 删除文件和修改文件属性。 我们将演示如何更改只读属性。
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 方法来获取更新后的文件详细信息。
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 提供了通过其属性访问目录信息的功能。 此示例探讨了与目录相关的功能。
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 流方法进行读取和写入。
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 的流方法提供了更多的控制。
来源
本教程介绍了如何在 C# 中使用 FileInfo 类进行文件操作,包括属性、复制、移动、属性和流访问。
作者
列出所有 C# 教程。