10.4 目录、编码与文件管理
很多文件 bug 来自“文件周边”的细节:路径不是你以为的位置,父目录不存在,编码不同,或者文件管理操作覆盖了重要数据。
相对路径和当前工作目录
相对路径不会自动相对于 C++ 源文件。它相对于当前工作目录,通常就是你运行程序时所在的目录。
cpp
std::filesystem::path path = std::filesystem::path("data") / "quotes.txt";
std::ifstream input(path);如果当前工作目录是项目根目录,C++ 会寻找:
text
project/
data/
quotes.txt但如果你从另一个目录运行程序,同一个相对路径可能找不到文件。
正在加载交互实验...
注意
相对路径失败时,先确认程序从哪里开始寻找文件。打印
std::filesystem::current_path() 可以查看当前工作目录。正在加载概念检查...
创建目录
如果 reports 目录不存在,写入 reports/summary.txt 会失败。先创建父目录。
cpp
#include <filesystem>
#include <fstream>
int main() {
std::filesystem::path folder = "reports";
std::filesystem::create_directories(folder);
std::filesystem::path report = folder / "summary.txt";
std::ofstream output(report);
output << "Report ready\n";
return 0;
}create_directories() 可以创建缺失的多级父目录;如果目录已经存在,它不会报错。
正在加载概念检查...
正在加载本节练习...
UTF-8 编码
文本文件保存的是字节。编码负责在字符和字节之间转换。UTF-8 是最常见、兼容性很好的文本编码之一。
cpp
std::ofstream output("note.txt");
output << "Hello, C++!\n";本章的 std::ifstream 和 std::ofstream 示例会把文本当作字节处理。如果源文件和终端都使用 UTF-8,通过 stream 写入 UTF-8 文本通常很直接。如果不同系统对编码理解不一致,纯英文可能看起来没问题,但中文和符号可能乱码。除非有特殊原因,课程示例中应保持 UTF-8 一致。
正在加载概念检查...
正在加载本节练习...
列出、复制、移动和删除
std::filesystem 可以检查和管理文件:
cpp
std::filesystem::path path = "note.txt";
std::cout << std::filesystem::exists(path) << std::endl;
std::cout << std::filesystem::file_size(path) << std::endl;
std::cout << std::filesystem::is_regular_file(path) << std::endl;目录遍历使用 std::filesystem::directory_iterator。
cpp
for (const auto& entry : std::filesystem::directory_iterator("reports")) {
std::cout << entry.path() << std::endl;
}常见管理函数:
std::filesystem::copy_file(source, target):复制文件。std::filesystem::rename(source, target):移动或重命名。std::filesystem::remove(path):删除文件或空目录。std::filesystem::remove_all(path):删除目录树。
这些操作可能覆盖、失败或删除数据,要谨慎对待。
正在加载概念检查...