====== 文件操作 (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) |