csharp:文件操作

文件操作 (File Operations)

C# 中的文件操作主要依赖于 `System.IO` 命名空间。主要涉及以下几个核心类:

  • File / FileInfo: 用于文件的创建、复制、删除、移动和打开。
  • Directory / DirectoryInfo: 用于目录(文件夹)的创建、移动和枚举。
  • FileStream / StreamWriter / StreamReader: 用于读写文件中的数据流。

区别

  • `File` 类:提供静态方法(Static),适合对文件进行一次性操作。
  • `FileInfo` 类:提供实例方法,需要 `new` 对象,适合对同一个文件进行多次操作(无需重复进行安全检查)。
using System;
using System.IO;
 
class Program
{
    static void Main(string[] args)
    {
        string filePath = @"D:\办公\程序模板\上位机Demo\学习\控制台\文件操作 -\测试文件\7777.txt"; 
 
        // 方法1:使用 File 静态类
        if (File.Exists(filePath))
        {
            Console.WriteLine("File 静态方法:文件存在");
        }
 
        // 方法2:使用 FileInfo 实例类
        FileInfo file = new FileInfo(filePath);
        if (file.Exists)
        {
            Console.WriteLine("FileInfo 实例方法:文件存在");
        }
        else
        {
            Console.WriteLine("文件不存在");
        }
 
        Console.Read();
    }
}

直接创建

使用 `File.Create` 或 `FileInfo.Create`。

// 静态方法
File.Create(@"C:\Test.txt");
 
// 实例方法
FileInfo finfo = new FileInfo(@"C:\Test.txt");
finfo.Create();

先查询再创建文件 (封装示例)

这是一个实际应用场景,封装一个类来处理文件检查和创建逻辑。

using System;
using System.IO;
 
namespace FileOperationDemo
{
    class Program
    {
        static void Main(string[] args)
        {   
            FileHandler getfile = new FileHandler(); // 创建操作对象
            string file_Name = "7777.txt";           // 定义文件名
 
            // 调用方法:存在则返回1,不存在创建后返回2
            int status = getfile.CheckOrCreateFile(file_Name); 
 
            Console.WriteLine("操作状态码: " + status);
            Console.Read();
        }
    }
 
    class FileHandler
    {   
        // 固定路径
        string BasePath = @"D:\办公\程序模板\上位机Demo\学习\控制台\文件操作 -\测试文件\";
        FileInfo fileInfoObj;
 
        // 判断文件是否存在,不存在则创建
        public int CheckOrCreateFile(string fileName)
        {   
            // 路径组合
            string fullPath = Path.Combine(BasePath, fileName);
 
            // 实例化 FileInfo 对象
            fileInfoObj = new FileInfo(fullPath);
 
            // 判断文件是否存在
            if (fileInfoObj.Exists)
            {
                Console.WriteLine("文件已存在");
                return 1; // 状态码:存在
            }
            else
            {   
                // 创建文件
                // 注意:Create() 返回 FileStream,如果不使用流,建议关闭,否则文件会被占用
                fileInfoObj.Create().Close(); 
                Console.WriteLine("文件不存在,已创建新文件");
                return 2; // 状态码:已创建
            }
        }
    }
}
string sourcePath = @"C:\Test.txt";
string destPath = @"D:\Test.txt";
 
// --- 复制 (Copy) ---
// 静态方法
File.Copy(sourcePath, destPath, true); // true 表示如果目标存在则覆盖
 
// 实例方法
FileInfo finfo = new FileInfo(sourcePath);
finfo.CopyTo(destPath, true);
 
// --- 移动 (Move) ---
// 静态方法
File.Move(sourcePath, destPath);
 
// 实例方法
FileInfo finfoMove = new FileInfo(sourcePath);
finfoMove.MoveTo(destPath);
string path = @"C:\Test.txt";
 
// 静态方法
if(File.Exists(path))
{
    File.Delete(path);
}
 
// 实例方法
FileInfo finfo = new FileInfo(path);
if(finfo.Exists)
{
    finfo.Delete(); // 永久删除,不进回收站
}

通过 `FileInfo` 类可以获取文件的详细属性。

FileInfo finfo = new FileInfo(@"C:\Test.txt");
 
if (finfo.Exists)
{
    string createTime = finfo.CreationTime.ToString();      // 创建时间
    string lastAccess = finfo.LastAccessTime.ToString();    // 上次访问时间
    string lastWrite = finfo.LastWriteTime.ToString();      // 上次写入时间
    string name = finfo.Name;                               // 文件名 (Test.txt)
    string fullName = finfo.FullName;                       // 完整路径 (C:\Test.txt)
    string dirName = finfo.DirectoryName;                   // 所在目录 (C:\)
    long size = finfo.Length;                               // 文件大小 (字节)
    bool isReadOnly = finfo.IsReadOnly;                     // 是否只读
 
    Console.WriteLine($"文件名: {name}, 大小: {size} 字节");
}

`DirectoryInfo` 用于创建、移动和枚举目录和子目录。

常用属性:

  • `FullName`: 目录完整路径。
  • `Name`: 目录名称。
  • `CreationTime`: 创建时间。
  • `Parent`: 父目录信息。
  • `Exists`: 判断目录是否存在。

常用方法:

  • `GetDirectories()`: 获取子目录。
  • `GetFiles()`: 获取目录下的文件。
  • `CreateSubdirectory(string path)`: 创建子目录。
  • `Delete(bool recursive)`: 删除目录(recursive=true 表示递归删除子内容)。
  • `MoveTo(string destDirName)`: 移动目录。
string dirPath = @"C:\TestDir";
 
// 静态方法
bool existsStatic = Directory.Exists(dirPath);
 
// 实例方法
DirectoryInfo dinfo = new DirectoryInfo(dirPath);
bool existsInstance = dinfo.Exists;

以下代码演示了初始化时检查并创建一系列所需的文件夹结构。

public class FolderManager
{
    public FolderManager()
    {
        string rootPath = @"D:\Data"; // 总目录
        DirectoryInfo dirInfo = new DirectoryInfo(rootPath);
 
        if (dirInfo.Exists == false)
        {
            // 1. 生成总目录
            dirInfo.Create();
 
            // 2. 生成 CCD 相机数据文件夹
            string ccdPath = Path.Combine(rootPath, "CCD_Data");
            DirectoryInfo ccdDir = new DirectoryInfo(ccdPath);
            ccdDir.Create();
 
            // 3. 生成操作日志文件夹
            string logPath = Path.Combine(rootPath, "操作日志_Data");
            DirectoryInfo logDir = new DirectoryInfo(logPath);
            logDir.Create();
 
            Console.WriteLine("文件夹结构初始化完成。");
        }
    }
}
DirectoryInfo dinfo = new DirectoryInfo(@"C:\OldDir");
// 将文件夹移动到新位置
dinfo.MoveTo(@"D:\NewDir"); 

<note important> 删除文件夹时要特别小心。如果文件夹不为空,必须使用递归删除参数。 </note>

DirectoryInfo dinfo = new DirectoryInfo(@"C:\TestDir");
 
// Delete() 无参数默认只能删除空文件夹
// Delete(true) 表示递归删除,包含里面的所有文件和子文件夹
dinfo.Delete(true); 
DirectoryInfo dinfo = new DirectoryInfo(@"C:\TestDir");
 
// 获取所有 jpg 图片
FileInfo[] files = dinfo.GetFiles("*.jpg"); 
 
foreach (FileInfo file in files)
{
    Console.WriteLine("发现图片: " + file.Name);
}
 
// 获取所有子文件夹
DirectoryInfo[] dirs = dinfo.GetDirectories();

流 (`Stream`) 是字节序列的抽象概念。 * 读取:从流传输到数据结构(如内存)。 * 写入:从数据源传输到流。 * FileStream:主要用于对磁盘文件进行读写操作,支持同步和异步。

创建 `FileStream` 时通常需要指定以下参数:

  1. FileMode (文件模式)
    • `Create`: 新建(覆盖)。
    • `CreateNew`: 新建(若存在则报错)。
    • `Open`: 打开现有。
    • `OpenOrCreate`: 打开或新建。
    • `Append`: 追加到末尾。
    • `Truncate`: 打开并清空内容。
  2. FileAccess (访问权限)
    • `Read`: 只读。
    • `Write`: 只写。
    • `ReadWrite`: 读写。
  3. FileShare (共享权限)
    • `None`: 独占文件。
    • `Read`: 允许其他进程读取。
// 示例:创建一个文件流
FileStream fs = new FileStream(@"C:\Test.txt", FileMode.OpenOrCreate, FileAccess.ReadWrite);

虽然 `FileStream` 可以读写字节,但处理文本通常使用 `StreamWriter` (写) 和 `StreamReader` (读) 包装类。

StreamWriter 简介

  • 专门处理文本写入。
  • Flush(): 清理缓冲区,确保数据真正写入磁盘。
  • Close(): 关闭流,释放资源。
  • 推荐使用 `using` 语句自动管理资源释放。

写入 (StreamWriter)

public int WriteTextData(string fileName, string strData)
{
    string basePath = @"D:\TestFiles\";
    string fullPath = basePath + fileName;
 
    // 第二个参数 true 表示 "追加模式" (Append)
    // 如果为 false,则表示覆盖模式
    using (StreamWriter writer = new StreamWriter(fullPath, true))
    {
        writer.WriteLine(strData); // 写入并换行
        writer.Flush();            // 刷新缓冲区
    } 
    // 使用 using 块后,会自动调用 Close() 和 Dispose()
 
    Console.WriteLine("数据写入完成");
    return 1;
}

读取 (StreamReader)

public void ReadTextData(string fileName)
{
    string fullPath = @"D:\TestFiles\" + fileName;
 
    if (!File.Exists(fullPath)) return;
 
    // 创建读取流
    using (StreamReader reader = new StreamReader(fullPath))
    {
        // 方法1:一次读一行
        // string line = reader.ReadLine();
 
        // 方法2:读取到末尾
        string content = reader.ReadToEnd();
        Console.WriteLine("文件内容:\n" + content);
    }
}
类名 主要用途 典型操作
DirectoryInfo 文件夹操作 创建目录、删除目录、获取子目录列表
FileInfo 文件本身操作 复制、移动、删除文件、获取文件大小/时间
FileStream 文件内容操作 底层字节读写、文件锁定控制
StreamWriter 文本写入 向文件中写入字符串 (基于 FileStream)
StreamReader 文本读取 从文件中读取字符串 (基于 FileStream)
请输入您的评论. 可以使用维基语法:
 

该主题尚不存在

您访问的页面并不存在。如果允许,您可以使用创建该页面按钮来创建它。

  • csharp/文件操作.txt
  • 最后更改: 2025/11/27 12:59
  • 张叶安