文件操作 (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");
删除文件夹
<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();
数据流 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) |