C# 文件系统I/O操作--File类与FileInfo类
File
和FileInfo
两个功能基本相同,他们都是基于System.IO命名空间的文件操作类。File 和 FileInfo 都是 .NET 基于System.IO命名空间中用于处理文件的类,但它们的设计理念和使用方式有所不同:
File
是静态类
,它不属于特定对象,所以不能被实例化,如果只是对文件单一、少量
的操作,如判断文件是否存在,建议使用File类。FileInfo
需要实例化对象
后才可以调用相关方法。它对应某一个文件进行重复操作
,如果是对一个文件进行大量的操作,建议使用FileInfo类。
一.File类
File 类是 文件操作的重要类。提供了许多静态方法,可以方便地进行文件和目录的创建、删除、复制、移动、打开单一文件等操作
并协助创建 FileStream 对象。
File是静态类,它不属于特定对象,所以不能被实例化,只能通过File.方法名调用其方法。
- 创建文件:
•File.Create(string path)
:创建或覆盖指定路径的文件
•File.CreateText(string path)
:创建或打开用于写入 UTF-8 编码文本的文件。 如果该文件已存在,将覆盖其内容。
•File.WriteAllText(string path, string contents)
:创建或覆盖指定路径的文件,并将字符串写入文件。
•File.WriteAllLines(string path, IEnumerable<string> contents)
:创建或覆盖指定路径的文件并将字符串集合写入文件
•File.AppendText(string path)
:创建一个 StreamWriter 对象,该对象可以向指定路径的文件追加文本。
•File.AppendAllLines(string path, IEnumerable contents)
:将字符串集合追加到指定路径的文件中,每个字符串占一行。换行
•File.AppendAllText(string path, string contents)
:将指定的字符串追加到指定路径的文件中。不换行 - 读取文件:
•File.ReadAllText(string path)
:读取指定路径文件的所有文本内容
•File.ReadAllLines(string path)
:读取指定路径文件的所有文本内容,按照一行行读取,返回字符串数组
•File.ReadAllBytes(string path)
:读取指定路径文件的所有字节内容,并返回一个字节数组。 - 删除文件:
•File.Delete(string path)
:删除指定路径的文件。 - 复制文件:
•File.Copy(string sourceFileName, string destFileName, bool overwrite)
:将指定源文件复制到目标位置 - 移动文件:
•File.Move(string sourceFileName, string destFileName)
:将指定源文件移动到目标位置。 - 检查文件是否存在:
•File.Exists(string path)
:检查指定路径的文件是否存在。(常配合Directory类使用)
1.文件操作判断相关方法
File.Exists(String)
File.Exists(String)
:确定指定的文件是否存在。返回True/False
using System;
using System.IO;
class Program
{
static void Main()
{
try
{
string sourcePath = "source.txt";
string destinationPath = "destination.txt";
// 检查文件是否存在
if (File.Exists(sourcePath))
{
Console.WriteLine("源文件存在。");
}
else
{
Console.WriteLine("源文件不存在。");
}
}
catch (IOException ex)
{
Console.WriteLine($"IO 错误: {ex.Message}");
}
catch (UnauthorizedAccessException ex)
{
Console.WriteLine($"无权限访问文件: {ex.Message}");
}
catch (Exception ex)
{
Console.WriteLine($"发生错误: {ex.Message}");
}
}
}
2. 创建并写入文本文件、追加文本
CreateText
File.CreateText(string path)
:创建或打开用于写入 UTF-8 编码文本的文件。 如果该文件已存在,将覆盖其内容。
using System;
using System.IO;
class Test
{
public static void Main()
{
string path = "example.txt";
if (!File.Exists(path))
{
// 创建一个要写入的文件。
using (StreamWriter sw = File.CreateText(path))
{
sw.WriteLine("Hello");
sw.WriteLine("And");
sw.WriteLine("Welcome");
}
}
}
}
WriteAllText
File.WriteAllText(string path, string contents)
:创建或覆盖指定路径的文件,并将字符串写入文件。
using System;
using System.IO;
class Program
{
static void Main()
{
string filePath = "example.txt";
string textToWrite = "Hello, World!";
// 创建文件并写入文本
File.WriteAllText(filePath, textToWrite);
Console.WriteLine("文件已创建并写入文本。");
File.AppendAllText(filePath ,$"追加文本内容1{DateTime.Now}");//不会换行
}
}
说明:
• 使用 File.WriteAllText 方法创建文件并写入文本内容。
• 如果文件已存在,则会被覆盖。
AppendText
File.AppendText(string path)
:创建一个 StreamWriter 对象,该对象可以向指定路径的文件追加文本。
using System;
using System.IO;
class Program
{
static void Main()
{
using (StreamWriter writer = File.AppendText("example.txt"))
{
writer.WriteLine("Hello, World!");
writer.WriteLine("This is a new line.");
}
Console.WriteLine("文本已追加到文件中。");
}
}
结果:
Hello, World!
This is a new line.
说明:
• 使用 File.AppendText 方法创建一个 StreamWriter 对象,该对象可以向文件追加文本。
• 使用 StreamWriter 的 WriteLine 方法逐行追加文本。自动换行
• using 语句确保 StreamWriter 在使用完毕后正确释放资源。
AppendAllText
File.AppendAllText(string path, string contents)
追加单行文本
using System;
using System.IO;
class Program
{
static void Main()
{
File.AppendAllText("example.txt", "Hello, World!\n");
Console.WriteLine("文本已追加到文件中。");
}
}
结果:
Hello, World!
说明:
• 使用 File.AppendAllText 方法将指定的字符串追加到文件中。 不换行
• 如果文件不存在,则会创建新文件。
AppendAllLines
File.AppendAllLines(string path, IEnumerable contents)
追加多行文本
using System;
using System.IO;
class Program
{
static void Main()
{
string[] lines = { "Line 1", "Line 2", "Line 3" };
File.AppendAllLines("example.txt", lines);
Console.WriteLine("行已追加到文件中。");
}
}
结果:
Line 1
Line 2
Line 3
3.读取文本文件内容
ReadAllText
File.ReadAllText(string path)
:读取指定路径文件的所有文本内容
using System;
using System.IO;
class Program
{
static void Main()
{
string filePath = "example.txt";
// 检查文件是否存在
if (File.Exists(filePath))
{
// 读取文件内容
string content = File.ReadAllText(filePath);
Console.WriteLine(content);
}
else
{
Console.WriteLine("文件不存在。");
}
}
}
结果:
Line 1Line 2Line 3
说明:
• 使用 File.Exists 方法检查文件是否存在。
• 使用 File.ReadAllText 方法读取文件内容并打印到控制台。
ReadAllLines
File.ReadAllLines(string path)
:读取指定路径文件的所有文本内容,按照一行行读取,返回字符串数组
using System;
using System.IO;
class Program
{
static void Main()
{
string[] lines = File.ReadAllLines("example.txt");
foreach (string line in lines)
{
Console.WriteLine(line);
}
}
}
结果:
Line 1
Line 2
Line 3
说明:
• 使用 File.ReadAllLines方法读取指定路径文件的所有文本内容,并返回一个字符串数组,每个元素对应文件中的一行。
• 如果文件不存在,会抛出FileNotFoundException。
ReadAllBytes
File.ReadAllBytes(string path)
:读取指定路径文件的所有字节内容,并返回一个字节数组。
using System;
using System.IO;
class Program
{
static void Main()
{
byte[] bytes = File.ReadAllBytes("example.bin");
Console.WriteLine($"文件大小: {bytes.Length} 字节");
}
}
结果:
文件大小: 1024 字节
说明:
• 使用 File.ReadAllBytes 方法读取指定路径文件的所有字节内容,并返回一个字节数组。
• 如果文件不存在,会抛出FileNotFoundException。
4. 复制文件
Copy
File.Copy(string sourceFileName, string destFileName, bool overwrite)
:将指定源文件复制到目标位置
using System;
using System.IO;
class Program
{
static void Main()
{
string sourceFilePath = "example.txt";
string destinationFilePath = "copy_example.txt";
// 检查源文件是否存在
if (File.Exists(sourceFilePath))
{
// 复制文件
File.Copy(sourceFilePath, destinationFilePath, true);
Console.WriteLine("文件已复制。");
}
else
{
Console.WriteLine("源文件不存在。");
}
}
}
说明:
• 使用 File.Exists 方法检查源文件是否存在。
• 使用 File.Copy 方法复制文件,第三个参数 true 表示如果目标文件已存在则覆盖。
5. 移动文件
Move
File.Move(string sourceFileName, string destFileName)
:将指定源文件移动到目标位置。
using System;
using System.IO;
class Program
{
static void Main()
{
string sourceFilePath = "example.txt";
string destinationFilePath = "moved_example.txt";
// 检查源文件是否存在
if (File.Exists(sourceFilePath))
{
// 移动文件
File.Move(sourceFilePath, destinationFilePath);
Console.WriteLine("文件已移动。");
}
else
{
Console.WriteLine("源文件不存在。");
}
}
}
说明:
• 使用 File.Exists 方法检查源文件是否存在。
• 使用 File.Move 方法将文件从源路径移动到目标路径。
6. 删除文件
Delete
File.Delete(string path)
:删除指定路径的文件。
using System;
using System.IO;
class Program
{
static void Main()
{
string filePath = "example.txt";
// 检查文件是否存在
if (File.Exists(filePath))
{
// 删除文件
File.Delete(filePath);
Console.WriteLine("文件已删除。");
}
else
{
Console.WriteLine("文件不存在。");
}
}
}
说明:
• 使用 File.Exists 方法检查文件是否存在。
• 使用 File.Delete 方法删除文件。
二. FileInfo类
FileInfo提供用于创建、复制、删除、移动和打开文件的属性和实例方法,并且帮助创建 FileStream 对象。 此类不能被继承。如果要对同一文件执行多个操作,则使用 FileInfo实例方法(而不是类的相应静态方法 File)可能更高效,因为安全检查并不总是必要的。
FileInfo常用属性
Name
:获取文件的名称,包括扩展名。FullName
: 获取文件的完整路径。DirectoryName
:获取文件所在的目录的完整路径。Exists
: 获取指示文件是否存在的布尔值。Length
: 获取文件的大小(字节)。返回值:一个长整型数值,表示文件的大小(字节)。CreationTime
: 获取或设置文件的创建日期和时间。返回值:一个 DateTime 对象,表示文件的创建日期和时间。LastWriteTime
: 获取或设置文件上次写入的时间。返回值:一个 DateTime 对象,表示文件上次写入的时间。LastAccessTime
: 获取或设置文件上次访问的时间。返回值:一个 DateTime 对象,表示文件上次访问的时间。
using System;
using System.IO;
class Program
{
static void Main()
{
try
{
FileInfo fileInfo = new FileInfo("example.txt");
if (fileInfo.Exists)
{
Console.WriteLine($"文件名: {fileInfo.Name}");
Console.WriteLine($"完整路径: {fileInfo.FullName}");
Console.WriteLine($"所在目录: {fileInfo.DirectoryName}");
Console.WriteLine($"文件大小: {fileInfo.Length} 字节");
Console.WriteLine($"创建时间: {fileInfo.CreationTime}");
Console.WriteLine($"最后写入时间: {fileInfo.LastWriteTime}");
Console.WriteLine($"最后访问时间: {fileInfo.LastAccessTime}");
}
else
{
Console.WriteLine("文件不存在。");
}
}
catch (FileNotFoundException ex)
{
Console.WriteLine($"文件未找到: {ex.Message}");
}
catch (Exception ex)
{
Console.WriteLine($"发生错误: {ex.Message}");
}
}
}
结果:
文件名: example.txt
完整路径: C:\path\to\your\project\example.txt
所在目录: C:\path\to\your\project
文件大小: 1024 字节
创建时间: 2023/10/01 12:34:56
最后写入时间: 2023/10/02 09:12:34
最后访问时间: 2023/10/02 09:12:34
说明:
• 创建一个 FileInfo 对象并检查文件是否存在。
• 如果文件存在,则输出文件的各种属性。
• 处理可能的异常,如FileNotFoundException。
FileInfo常用方法
CopyTo(string destFileName)
将现有文件复制到新位置,不允许覆盖同名文件。
• 参数:
• destFileName:目标文件路径。
• 返回值:一个新的 FileInfo 对象,表示目标文件。MoveTo(string destFileName)
将文件移动到新位置。
• 参数:
• destFileName:目标文件路径。Delete()
删除文件。OpenRead()
打开文件以进行读取。
• 返回值:一个 FileStream 对象,表示打开的文件。OpenWrite()
打开文件以进行写入。
• 返回值:一个 FileStream 对象,表示打开的文件。CreateText()
创建一个 StreamWriter 对象,用于向文件写入字符。
• 返回值:一个 StreamWriter 对象,表示创建的流写入器。AppendText()
创建一个 StreamWriter 对象,用于向文件追加字符。
• 返回值:一个 StreamWriter 对象,表示创建的流写入器。
1.判断文件是否存在
Exists()
using System;
using System.IO;
class Program
{
static void Main()
{
try
{
string sourcePath = "source.txt";
string destinationPath = "destination.txt";
// 创建 FileInfo 对象
FileInfo sourceFile = new FileInfo(sourcePath);
if (sourceFile.Exists)
{
Console.WriteLine("源文件存在。");
}
else
{
Console.WriteLine("源文件不存在。");
}
}
catch (IOException ex)
{
Console.WriteLine($"IO 错误: {ex.Message}");
}
catch (UnauthorizedAccessException ex)
{
Console.WriteLine($"无权限访问文件: {ex.Message}");
}
catch (Exception ex)
{
Console.WriteLine($"发生错误: {ex.Message}");
}
}
}
2. 创建并写入文本文件、追加文本
CreateText()
CreateText()
:创建一个 StreamWriter 对象,用于向文件写入字符。
using System;
using System.IO;
class Program
{
static void Main()
{
try
{
FileInfo fileInfo = new FileInfo("example.txt");
using (StreamWriter writer = fileInfo.CreateText())
{
writer.WriteLine("Hello, World!");
Console.WriteLine("文本已写入文件。");
}
}
catch (IOException ex)
{
Console.WriteLine($"IO 错误: {ex.Message}");
}
catch (UnauthorizedAccessException ex)
{
Console.WriteLine($"无权限访问文件: {ex.Message}");
}
catch (Exception ex)
{
Console.WriteLine($"发生错误: {ex.Message}");
}
}
}
结果:
文本已写入文件。
说明:
• 创建一个 StreamWriter 对象,用于向 example.txt 文件写入字符。
• 写入字符串 “Hello,World!” 到文件中。
• 处理可能的异常,如 IOException 和 UnauthorizedAccessException。
OpenWrite()
OpenWrite()
打开文件以进行写入。
返回值:一个 FileStream 对象,表示打开的文件。
using System;
using System.IO;
class Program
{
static void Main()
{
try
{
FileInfo fileInfo = new FileInfo("example.txt");
if (fileInfo.Exists)
{
using (FileStream fs = fileInfo.OpenWrite())
{
byte[] data = System.Text.Encoding.UTF8.GetBytes("Hello, World!");
fs.Write(data, 0, data.Length);
Console.WriteLine("数据已写入文件。");
}
}
else
{
Console.WriteLine("文件不存在。");
}
}
catch (IOException ex)
{
Console.WriteLine($"IO 错误: {ex.Message}");
}
catch (UnauthorizedAccessException ex)
{
Console.WriteLine($"无权限访问文件: {ex.Message}");
}
catch (Exception ex)
{
Console.WriteLine($"发生错误: {ex.Message}");
}
}
}
说明:
• 打开 example.txt 文件以进行写入。
• 写入字符串 “Hello, World!” 到文件中。
• 处理可能的异常,如IOException 和 UnauthorizedAccessException。
结果:
数据已写入文件。
AppendText()
• AppendText()
:创建一个 StreamWriter 对象,用于向文件追加字符。
using System;
using System.IO;
class Program
{
static void Main()
{
try
{
FileInfo fileInfo = new FileInfo("example.txt");
using (StreamWriter writer = fileInfo.AppendText())
{
writer.WriteLine("这是追加的文本。");
Console.WriteLine("文本已追加到文件。");
}
}
catch (IOException ex)
{
Console.WriteLine($"IO 错误: {ex.Message}");
}
catch (UnauthorizedAccessException ex)
{
Console.WriteLine($"无权限访问文件: {ex.Message}");
}
catch (Exception ex)
{
Console.WriteLine($"发生错误: {ex.Message}");
}
}
}
说明:
• 创建一个 StreamWriter 对象,用于向 example.txt 文件追加字符。
• 追加字符串 “这是追加的文本。” 到文件中。
• 处理可能的异常,如 IOException 和 UnauthorizedAccessException。
结果:
文本已追加到文件。
3.读取文本文件内容
OpenRead()
OpenRead()
打开文件以进行读取。
返回值:一个 FileStream 对象,表示打开的文件。
using System;
using System.IO;
class Program
{
static void Main()
{
try
{
FileInfo fileInfo = new FileInfo("example.txt");
if (fileInfo.Exists)
{
using (FileStream fs = fileInfo.OpenRead())
{
byte[] buffer = new byte[fs.Length];
int bytesRead = fs.Read(buffer, 0, buffer.Length);
Console.WriteLine($"读取了 {bytesRead} 字节的数据。");
}
}
else
{
Console.WriteLine("文件不存在。");
}
}
catch (IOException ex)
{
Console.WriteLine($"IO 错误: {ex.Message}");
}
catch (UnauthorizedAccessException ex)
{
Console.WriteLine($"无权限访问文件: {ex.Message}");
}
catch (Exception ex)
{
Console.WriteLine($"发生错误: {ex.Message}");
}
}
}
说明:
• 打开 example.txt 文件以进行读取。
• 读取文件内容并输出读取的字节数。
• 处理可能的异常,如 IOException 和 UnauthorizedAccessException。
结果:
读取了 1024 字节的数据。
4. 复制文件
CopyTo(string destFileName)
CopyTo(string destFileName)
将现有文件复制到新位置,不允许覆盖同名文件。
参数:
• destFileName:目标文件路径。
• 返回值:一个新的 FileInfo 对象,表示目标文件
using System;
using System.IO;
class Program
{
static void Main()
{
try
{
FileInfo sourceFile = new FileInfo("source.txt");
string destinationPath = "destination.txt";
if (sourceFile.Exists)
{
FileInfo copiedFile = sourceFile.CopyTo(destinationPath, false); // 不允许覆盖
Console.WriteLine($"文件已复制到: {copiedFile.FullName}");
}
else
{
Console.WriteLine("源文件不存在。");
}
}
catch (IOException ex)
{
Console.WriteLine($"IO 错误: {ex.Message}");
}
catch (UnauthorizedAccessException ex)
{
Console.WriteLine($"无权限访问文件: {ex.Message}");
}
catch (Exception ex)
{
Console.WriteLine($"发生错误: {ex.Message}");
}
}
}
说明:
• 将 source.txt 文件复制到 destination.txt。
• 不允许覆盖同名文件。
• 处理可能的异常,如IOException 和 UnauthorizedAccessException。
结果:
文件已复制到: C:\path\to\your\project\destination.txt
5. 移动文件
MoveTo(string destFileName)
MoveTo(string destFileName)
将文件移动到新位置。
参数:
• destFileName:目标文件路径。
using System;
using System.IO;
class Program
{
static void Main()
{
try
{
FileInfo sourceFile = new FileInfo("source.txt");
string destinationPath = "movedSource.txt";
if (sourceFile.Exists)
{
sourceFile.MoveTo(destinationPath);
Console.WriteLine($"文件已移动到: {destinationPath}");
}
else
{
Console.WriteLine("源文件不存在。");
}
}
catch (IOException ex)
{
Console.WriteLine($"IO 错误: {ex.Message}");
}
catch (UnauthorizedAccessException ex)
{
Console.WriteLine($"无权限访问文件: {ex.Message}");
}
catch (Exception ex)
{
Console.WriteLine($"发生错误: {ex.Message}");
}
}
}
说明:
• 将 source.txt 文件移动到 movedSource.txt。
• 处理可能的异常,如 IOException 和 UnauthorizedAccessException。
结果:
文件已移动到: movedSource.txt
6. 删除文件
Delete()
Delete()
删除文件。
using System;
using System.IO;
class Program
{
static void Main()
{
try
{
FileInfo fileToDelete = new FileInfo("example.txt");
if (fileToDelete.Exists)
{
fileToDelete.Delete();
Console.WriteLine("文件已删除。");
}
else
{
Console.WriteLine("文件不存在。");
}
}
catch (IOException ex)
{
Console.WriteLine($"IO 错误: {ex.Message}");
}
catch (UnauthorizedAccessException ex)
{
Console.WriteLine($"无权限访问文件: {ex.Message}");
}
catch (Exception ex)
{
Console.WriteLine($"发生错误: {ex.Message}");
}
}
}
说明:
• 删除 example.txt 文件。
• 处理可能的异常,如 IOException 和 UnauthorizedAccessException。
结果:
文件已删除。
三. File 类与FileInfo 类优缺点对比
File 类的优点和缺点
优点
- 简单易用:
• 提供静态方法,可以直接调用,无需实例化对象。
• 对于简单的文件操作非常方便快捷。- 性能较好:
• 因为是静态方法,避免了对象创建的开销,对于大量文件操作可能更高效。- 适用于一次性操作:
• 当只需要进行一次性的文件操作(如复制、删除)时,使用 File 类更为简洁。
缺点
- 缺乏状态管理:
• 没有状态管理机制,每次操作都需要指定完整的文件路径。
• 不适合需要多次操作同一文件的情况。- 代码可读性较差:
• 对于复杂的文件操作逻辑,使用静态方法可能导致代码难以阅读和维护。- 灵活性有限:
• 功能相对固定,无法像 FileInfo 类那样灵活地扩展和自定义行为。
FileInfo 类优点和缺点
优点
- 面向对象设计:
• 代表具体的文件对象,提供了丰富的属性和方法,便于管理和操作文件。
• 可以存储文件的状态信息,适合多次操作同一个文件的情况。- 易于维护:
• 使用对象的方式组织代码,结构清晰,便于维护和扩展。
• 可以轻松地管理多个文件对象,而不需要重复调用静态方法。- 支持更多的功能:
• 提供了许多高级功能,如文件的创建时间、修改时间、长度等属性。
• 支持打开文件流进行读写操作,灵活性更高。
缺点
- 对象创建开销:
• 需要创建 FileInfo 对象,可能会带来一定的内存和性能开销。
• 在需要频繁创建和销毁文件对象的情况下,可能不如 File 类高效。- 复杂度增加:
• 面向对象的设计增加了代码的复杂性,对于简单的文件操作显得有些繁琐。
• 新手可能需要更多的时间来理解和使用 FileInfo 类。- 不适合一次性操作:
• 对于只需要进行一次性的文件操作(如复制、删除),使用 FileInfo 类会显得冗余。
四. 总结
• File 类:适用于简单的、一次性文件操作,代码简洁,性能较好。如:
• FileInfo 类:适用于需要多次操作同一文件或需要访问文件详细信息的情况,代码更具结构性和可维护性更高。