====== 文件操作 (File Operations) ====== C# 中的文件操作主要依赖于 `System.IO` 命名空间。主要涉及以下几个核心类: * **File / FileInfo**: 用于文件的创建、复制、删除、移动和打开。 * **Directory / DirectoryInfo**: 用于目录(文件夹)的创建、移动和枚举。 * **FileStream / StreamWriter / StreamReader**: 用于读写文件中的数据流。 ===== 文件操作 FileInfo ===== **区别**: * `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 ===== ==== DirectoryInfo 简介 ==== `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"); ==== 删除文件夹 ==== 删除文件夹时要特别小心。如果文件夹不为空,必须使用递归删除参数。 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(); ===== 数据流 FileStream ===== ==== 数据流简介 ==== 流 (`Stream`) 是字节序列的抽象概念。 * **读取**:从流传输到数据结构(如内存)。 * **写入**:从数据源传输到流。 * **FileStream**:主要用于对磁盘文件进行读写操作,支持同步和异步。 ==== 文件流 FileStream 参数详解 ==== 创建 `FileStream` 时通常需要指定以下参数: - **FileMode (文件模式)** * `Create`: 新建(覆盖)。 * `CreateNew`: 新建(若存在则报错)。 * `Open`: 打开现有。 * `OpenOrCreate`: 打开或新建。 * `Append`: 追加到末尾。 * `Truncate`: 打开并清空内容。 - **FileAccess (访问权限)** * `Read`: 只读。 * `Write`: 只写。 * `ReadWrite`: 读写。 - **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) |