C++17 文件系统库
C++17 引入了新的标准库组件——文件系统库(<filesystem>
)。该库为 C++ 提供了强大的文件和目录操作功能,使得处理文件系统中的路径、文件和目录变得更加方便和一致。文件系统库是对 Boost.Filesystem 库的标准化,使得许多文件操作功能变得标准化且易于使用。
1. 基本概念
- 路径:表示文件或目录在文件系统中的位置。使用
std::filesystem::path
类来处理。 - 文件系统操作:包括文件和目录的创建、删除、复制、移动等操作。使用
std::filesystem
命名空间中的函数来执行。 - 迭代器:可以用于遍历目录中的内容。
2. 主要功能和类
std::filesystem::path
:表示文件系统路径。支持路径拼接、解析等操作。
示例:路径操作
#include <filesystem>
#include <iostream>
int main() {
std::filesystem::path p1 = "example";
std::filesystem::path p2 = p1 / "file.txt";
std::cout << "Path: " << p2 << std::endl;
std::cout << "Parent Path: " << p2.parent_path() << std::endl;
std::cout << "Filename: " << p2.filename() << std::endl;
return 0;
}
std::filesystem::directory_entry
:表示目录中的一个文件或子目录。可以用于访问文件的属性和信息。
示例:访问文件属性
#include <filesystem>
#include <iostream>
int main() {
std::filesystem::directory_entry entry("example.txt");
std::cout << "Path: " << entry.path() << std::endl;
std::cout << "Is Regular File: " << entry.is_regular_file() << std::endl;
std::cout << "Size: " << entry.file_size() << std::endl;
return 0;
}
std::filesystem::directory_iterator
:用于遍历目录中的文件和子目录。
示例:遍历目录
#include <filesystem>
#include <iostream>
int main() {
std::filesystem::path p = ".";
for (const auto& entry : std::filesystem::directory_iterator(p)) {
std::cout << entry.path() << std::endl;
}
return 0;
}
3. 常用函数
文件和目录操作
-
创建和删除目录:
std::filesystem::create_directory("new_directory"); std::filesystem::remove("new_directory");
-
创建和删除文件:
std::filesystem::path file = "new_file.txt"; std::ofstream(file) << "Hello, World!"; // 创建并写入文件 std::filesystem::remove(file); // 删除文件
-
复制和移动文件:
std::filesystem::copy("source.txt", "destination.txt"); std::filesystem::rename("old_name.txt", "new_name.txt");
-
获取文件状态:
auto status = std::filesystem::status("file.txt"); if (std::filesystem::exists(status)) { std::cout << "File exists" << std::endl; }
4. 错误处理
使用文件系统库时,许多函数可能会抛出 std::filesystem::filesystem_error
异常。建议使用 try-catch
块来捕获和处理这些异常。
示例:错误处理
#include <filesystem>
#include <iostream>
int main() {
try {
std::filesystem::remove("non_existent_file.txt");
} catch (const std::filesystem::filesystem_error& e) {
std::cout << "Filesystem error: " << e.what() << std::endl;
}
return 0;
}
5. 总结
C++17 的文件系统库提供了丰富的功能来处理文件和目录,极大地简化了与文件系统交互的操作。它是一个强大的工具,帮助开发者更加高效地管理文件和目录操作,同时确保了跨平台的一致性和可靠性。