Files
XCEngine/docs/api/XCEngine/Core/FileWriter/FileWriter.md

98 lines
2.5 KiB
Markdown
Raw Normal View History

2026-03-26 16:45:24 +08:00
# FileWriter
**命名空间**: `XCEngine::Core`
**类型**: `class`
**头文件**: `XCEngine/Core/FileWriter.h`
2026-03-27 19:18:53 +08:00
**描述**: 一个基于 `FILE*` 的轻量文件写入封装,提供打开、关闭、写入和刷新能力。
2026-03-26 16:45:24 +08:00
2026-03-27 19:18:53 +08:00
## 角色概述
2026-03-26 16:45:24 +08:00
2026-03-27 19:18:53 +08:00
`FileWriter` 是当前 `Core` 顶层里非常朴素的 I/O 工具类。它没有做复杂的路径解析、目录创建或异步写入,只是把一组常见的 C 文件写入操作包装成 RAII 风格接口。
2026-03-26 16:45:24 +08:00
2026-03-27 19:18:53 +08:00
这类工具在引擎里常用于:
2026-03-26 16:45:24 +08:00
2026-03-27 19:18:53 +08:00
- 简单二进制导出
- 文本或日志写出
- 不需要完整文件系统抽象时的底层落盘
2026-03-26 16:45:24 +08:00
2026-03-27 19:18:53 +08:00
## 当前实现行为
2026-03-26 16:45:24 +08:00
2026-03-27 19:18:53 +08:00
### 1. 构造和析构遵循 RAII
- 默认构造不会自动打开文件
- 带路径构造会立刻尝试 `Open()`
- 析构函数会自动 `Close()`
### 2. `Open()` 会先关闭旧文件
当前 `Open(const char* filePath, bool append)` 的第一步就是调用 `Close()`。这意味着:
- 可以重复复用同一个 `FileWriter`
- 打开新文件前,旧句柄会先被安全关闭
### 3. 始终以二进制模式打开
当前模式字符串是:
- `append == false` -> `"wb"`
- `append == true` -> `"ab"`
也就是说,它没有文本模式分支,始终按二进制写入处理。
### 4. `Write()` 的失败条件很直接
`Write(const char* data, size_t length)` 在以下情况返回 `false`
- 文件没打开
- `data == nullptr`
- `length == 0`
- `fwrite` 未完整写入指定长度
这意味着“空写入”也会被视为失败,而不是 no-op success。
### 5. `Write(const Containers::String&)` 只是便利重载
它会转发到字节写入版本,使用:
- `str.CStr()`
- `str.Length()`
当前没有额外编码转换或换行处理。
## 当前代码库中的使用情况
在当前取证范围内,没有看到 `FileWriter``engine/src` 里形成广泛调用链。因此它当前更像底层通用工具,而不是高频核心主线类型。
## 线程语义
- 当前实现没有加锁。
- `FILE*` 句柄由对象内部独占持有。
- 默认应按单线程顺序使用。
## 当前实现限制
- 不会自动创建父目录。
- 只提供写入,不提供读取。
- 打开模式固定为二进制写/追加。
- `Write(length == 0)` 会返回 `false`
- 没有看到直接单元测试覆盖。
## 相关方法
- [Constructor](Constructor.md)
- [Destructor](Destructor.md)
- [Open](Open.md)
- [Close](Close.md)
- [Write](Write.md)
- [Flush](Flush.md)
- [IsOpen](IsOpen.md)
2026-03-26 16:45:24 +08:00
## 相关文档
2026-03-27 19:18:53 +08:00
- [当前模块](../Core.md)
- [IO](../IO/IO.md)
- [API 总索引](../../../main.md)