目录
路径操作
目录遍历
文件检查和操作
总结
每次写C++进行目录操作时,我一般都是调平台的SDK,尤其是win32 api 非常难记,于是查一下文档看看有没有和Python中os模块一样好用的库。
于是发现 filesystem,从来没用过(我的第六版C++ primer 最新标准只介绍了C++11)
用法整理如下,仅供参考
当你需要对计算机上的文件和目录进行操作时,C++17标准库中的<filesystem>
头文件可以为你提供方便的工具。它提供了一系列的类和函数来处理文件和目录的操作,包括路径操作、目录遍历、文件检查、文件操作等等。本文将为你介绍<filesystem>
头文件的使用方法和功能。
当你需要对计算机上的文件和目录进行操作时,C++17标准库中的<filesystem>
头文件可以为你提供方便的工具。它提供了一系列的类和函数来处理文件和目录的操作,包括路径操作、目录遍历、文件检查、文件操作等等。本文将为你介绍<filesystem>
头文件的使用方法和功能。
路径操作
<filesystem>
头文件中的path
类用于表示文件或目录的路径。你可以使用各种运算符和函数来操作路径。
首先,你可以使用/
运算符来将路径组合起来。例如:
#include <filesystem>
#include <iostream>
namespace fs = std::filesystem;
int main() {
fs::path p1 = "C:/Users/";
fs::path p2 = "John/Documents/";
fs::path p3 = p1 / p2;
std::cout << p3 << std::endl;
return 0;
}
上面的代码将输出"C:/Users/John/Documents"
,这是将两个路径组合起来的结果。
你还可以使用+=
运算符将路径附加到现有路径上:
#include <filesystem>
#include <iostream>
namespace fs = std::filesystem;
int main() {
fs::path p1 = "C:/Users/";
fs::path p2 = "John/Documents/";
p1 += p2;
std::cout << p1 << std::endl;
return 0;
}
上面的代码将输出"C:/Users/John/Documents"
,这是将路径附加到现有路径的结果。
如果你需要比较两个路径,你可以使用==
和!=
运算符来比较它们是否相等:
#include <filesystem>
#include <iostream>
namespace fs = std::filesystem;
int main() {
fs::path p1 = "C:/Users/John/Documents/";
fs::path p2 = "C:/Users/Jane/Documents/";
if (p1 == p2) {
std::cout << "The paths are equal" << std::endl;
} else {
std::cout << "The paths are not equal" << std::endl;
}
return 0;
}
上面的代码将输出"The paths are not equal"
,这是因为两个路径不相等。
除了运算符,path
类还提供了一些有用的函数来操作路径。例如,你可以使用parent_path()
函数来获取路径中的父目录:
#include <filesystem>
#include <iostream>
namespace fs = std::filesystem;
int main() {
fs::path p = "C:/Users/John/Documents/report.txt";
fs::path parent = p.parent_path();
std::cout << parent << std::endl;
return 0;
}
上面的代码将输出"C:/Users/John/Documents"
,这是路径中的父目录。
你还可以使用stem()
函数来获取路径中的文件名(不包括扩展名):
#include <filesystem>
#include <iostream>
namespace fs = std::filesystem;
int main() {
fs::path p = "C:/Users/John/Documents/report.txt";
fs::path filename = p.stem();
std::cout << filename << std::endl;
return 0;
}
上面的代码将输出`"report"`,这是文件名(不包括扩展名)。
如果你需要获取路径中的扩展名,可以使用`extension()`函数:
#include <filesystem>
#include <iostream>
namespace fs = std::filesystem;
int main() {
fs::path p = "C:/Users/John/Documents/report.txt";
fs::path extension = p.extension();
std::cout << extension << std::endl;
return 0;
}
上面的代码将输出".txt"
,这是文件的扩展名。
目录遍历
<filesystem>
头文件提供了一些函数来遍历目录中的文件和子目录。你可以使用directory_iterator
类来遍历目录中的所有内容。例如,下面的代码将遍历目录"C:/Users/John/Documents"
中的所有文件和子目录:
#include <filesystem>
#include <iostream>
namespace fs = std::filesystem;
int main() {
fs::path p = "C:/Users/John/Documents";
for (auto& entry : fs::directory_iterator(p)) {
std::cout << entry.path() << std::endl;
}
return 0;
}
上面的代码将输出目录中的所有文件和子目录的路径。
如果你只想遍历目录中的文件,可以使用is_regular_file()
函数来判断一个条目是否是一个普通文件:
#include <filesystem>
#include <iostream>
namespace fs = std::filesystem;
int main() {
fs::path p = "C:/Users/John/Documents";
for (auto& entry : fs::directory_iterator(p)) {
if (fs::is_regular_file(entry)) {
std::cout << entry.path() << std::endl;
}
}
return 0;
}
上面的代码将输出目录中的所有文件的路径。
如果你只想遍历目录中的子目录,可以使用is_directory()
函数来判断一个条目是否是一个目录:
#include <filesystem>
#include <iostream>
namespace fs = std::filesystem;
int main() {
fs::path p = "C:/Users/John/Documents";
for (auto& entry : fs::directory_iterator(p)) {
if (fs::is_directory(entry)) {
std::cout << entry.path() << std::endl;
}
}
return 0;
}
上面的代码将输出目录中的所有子目录的路径。
C++17 的 <filesystem>
标准库提供了获取当前工作目录和创建目录的功能。
获取当前工作目录的方式是通过 std::filesystem::current_path
函数来实现,它返回一个 std::filesystem::path
类型的对象,表示当前工作目录的路径。例如:
#include <filesystem>
#include <iostream>
int main() {
std::filesystem::path currentPath = std::filesystem::current_path();
std::cout << "Current working directory is: " << currentPath << std::endl;
return 0;
}
创建目录的方式是通过 std::filesystem::create_directory
函数来实现,它接受一个 std::filesystem::path
类型的对象,表示要创建的目录的路径。例如:
#include <filesystem>
#include <iostream>
int main() {
std::filesystem::path dirPath = "C:/mydir";
if (std::filesystem::create_directory(dirPath)) {
std::cout << "Directory created successfully." << std::endl;
} else {
std::cout << "Failed to create directory." << std::endl;
}
return 0;
}
文件检查和操作
<filesystem>
头文件中的<fstream>
和<iostream>
头文件提供了一些函数来检查和操作文件。例如,你可以使用exists()
函数来检查文件是否存在:
#include <filesystem>
#include <iostream>
namespace fs = std::filesystem;
int main() {
fs::path p = "C:/Users/John/Documents/report.txt";
if (fs::exists(p)) {
std::cout << "The file exists" << std::endl;
} else {
std::cout << "The file does not exist" << std::endl;
}
return 0;
}
上面的代码将输出"The file exists"
,如果文件存在的话。
你可以使用remove()
函数来删除文件:
#include <filesystem>
#include <iostream>
namespace fs = std::filesystem;
int main() {
fs::path p = "C:/Users/John/Documents/report.txt";
if (fs::exists(p)) {
fs::remove(p);
std::cout << "The file was successfully deleted" << std::endl;
} else {
std::cout << "The file does not exist" << std::endl;
}
return 0;
}
上面的代码将删除文件并输出"The file was successfully deleted"
,如果文件存在的话。
你也可以使用copy()
函数来复制文件:
#include <filesystem>
#include <iostream>
namespace fs = std::filesystem;
int main() {
fs::path source = "C:/Users/John/Documents/report.txt";
fs::path target = "C:/Users/John/Documents/report_copy.txt";
if (fs::exists(source)) {
fs::copy(source, target);
std::cout << "The file was successfully copied" << std::endl;
} else {
std::cout << "The file does not exist" << std::endl;
}
return 0;
}
上面的代码将复制文件并输出"The file was successfully copied"
,如果源文件存在的话。
你还可以使用rename()
函数来重命名文件:
#include <filesystem>
#include <iostream>
namespace fs = std::filesystem;
int main() {
fs::path old_path = "C:/Users/John/Documents/report.txt";
fs::path new_path = "C:/Users/John/Documents/report_renamed.txt";
if (fs::exists(old_path)) {
fs::rename(old_path, new_path);
std::cout << "The file was successfully renamed" << std::endl;
} else {
std::cout << "The file does not exist" << std::endl;
}
return 0;
}
上面的代码将重命名文件并输出"The file was successfully renamed"
,如果原文件存在的话。文章来源:https://www.toymoban.com/news/detail-646278.html
总结
<filesystem>
头文件提供了一组强大的工具来处理文件系统。你可以使用它来管理文件和目录,获取文件和目录的信息,以及执行文件操作。这些功能使得处理文件和目录变得更加容易,而且可移植性更好,因为<filesystem>
头文件可以在多个平台上使用。文章来源地址https://www.toymoban.com/news/detail-646278.html
到了这里,关于C++17 文件与目录操作 <filesystem>的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!