C# 文件系统I/O操作--File类与FileInfo类

发布于:2024-12-20 ⋅ 阅读:(17) ⋅ 点赞:(0)

FileFileInfo两个功能基本相同,他们都是基于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常用属性

  1. Name:获取文件的名称,包括扩展名。
  2. FullName: 获取文件的完整路径。
  3. DirectoryName:获取文件所在的目录的完整路径。
  4. Exists: 获取指示文件是否存在的布尔值。
  5. Length: 获取文件的大小(字节)。返回值:一个长整型数值,表示文件的大小(字节)。
  6. CreationTime: 获取或设置文件的创建日期和时间。返回值:一个 DateTime 对象,表示文件的创建日期和时间。
  7. LastWriteTime: 获取或设置文件上次写入的时间。返回值:一个 DateTime 对象,表示文件上次写入的时间。
  8. 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常用方法

  1. CopyTo(string destFileName) 将现有文件复制到新位置,不允许覆盖同名文件。
    • 参数:
    • destFileName:目标文件路径。
    • 返回值:一个新的 FileInfo 对象,表示目标文件。
  2. MoveTo(string destFileName) 将文件移动到新位置。
    • 参数:
    • destFileName:目标文件路径。
  3. Delete() 删除文件。
  4. OpenRead() 打开文件以进行读取。
    • 返回值:一个 FileStream 对象,表示打开的文件。
  5. OpenWrite() 打开文件以进行写入。
    • 返回值:一个 FileStream 对象,表示打开的文件。
  6. CreateText() 创建一个 StreamWriter 对象,用于向文件写入字符。
    • 返回值:一个 StreamWriter 对象,表示创建的流写入器。
  7. 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 类的优点和缺点

优点

  1. 简单易用:
    • 提供静态方法,可以直接调用,无需实例化对象。
    • 对于简单的文件操作非常方便快捷。
  2. 性能较好:
    • 因为是静态方法,避免了对象创建的开销,对于大量文件操作可能更高效。
  3. 适用于一次性操作:
    • 当只需要进行一次性的文件操作(如复制、删除)时,使用 File 类更为简洁。

缺点

  1. 缺乏状态管理:
    • 没有状态管理机制,每次操作都需要指定完整的文件路径。
    • 不适合需要多次操作同一文件的情况。
  2. 代码可读性较差:
    • 对于复杂的文件操作逻辑,使用静态方法可能导致代码难以阅读和维护。
  3. 灵活性有限:
    • 功能相对固定,无法像 FileInfo 类那样灵活地扩展和自定义行为。

FileInfo 类优点和缺点

优点

  1. 面向对象设计:
    • 代表具体的文件对象,提供了丰富的属性和方法,便于管理和操作文件。
    • 可以存储文件的状态信息,适合多次操作同一个文件的情况。
  2. 易于维护:
    • 使用对象的方式组织代码,结构清晰,便于维护和扩展。
    • 可以轻松地管理多个文件对象,而不需要重复调用静态方法。
  3. 支持更多的功能:
    • 提供了许多高级功能,如文件的创建时间、修改时间、长度等属性。
    • 支持打开文件流进行读写操作,灵活性更高。

缺点

  1. 对象创建开销:
    • 需要创建 FileInfo 对象,可能会带来一定的内存和性能开销。
    • 在需要频繁创建和销毁文件对象的情况下,可能不如 File 类高效。
  2. 复杂度增加:
    • 面向对象的设计增加了代码的复杂性,对于简单的文件操作显得有些繁琐。
    • 新手可能需要更多的时间来理解和使用 FileInfo 类。
  3. 不适合一次性操作:
    • 对于只需要进行一次性的文件操作(如复制、删除),使用 FileInfo 类会显得冗余。

四. 总结

• File 类:适用于简单的、一次性文件操作,代码简洁,性能较好。如:
• FileInfo 类:适用于需要多次操作同一文件或需要访问文件详细信息的情况,代码更具结构性和可维护性更高。