一、文件系统
1、在C++ 17中可以使用 filesystem 。为名字空间起个别名,如:namespace fs = std::filesystem;
2、需要引入头文件:#include<filesystem>
3、由于使用了C++ 17的特性,所以需要将工程的语言设置成C++ 17 或者更高的版本。具体操作如下:
(1)、右键项目名称,选择“属性”
(2)、然后进行如下操作
二、C++中对文件读取操作
1、判读文件是否存在,并输出文件的大小:
#include<iostream>
#include<filesystem>
#include<string>
using namespace std;
int main() {
// 由于命名空间名字太长,所以可以将其起一个别名为fs
namespace fs = experimental::filesystem;
string path01 = "E:\\Data\\Test01\\out.txt";
//定义路径:path 是一个类,定义该类的一个实例,并用指定的路径对其进行初始化
// 可以使用:转义字符串、生字符串、正斜杠字符串来写该路径
fs::path p1{ path01 }; //1、以转义字符串的方式来写定义该路径
fs::path p2{ R"(E:\Data\Test01)" }; //2、以生字符串的方式来写
fs::path p3{ "E:/Data/Test01/out.txt" }; // 3、以正斜杠的方式来写,类似于Linux系统的写法
// 输出默认文件分隔符
cout << "file separator is: " <<fs::path::preferred_separator << endl;
// 判读是否是常规文件,如果是,输出文件大小
if (fs::is_regular_file(p2)) {
cout << p2 << "'s size is: " << fs::file_size(p2) << endl;
}
// 若不是常规文件,则可能是目录,就用for循环列出其所有子目录
else if (fs::is_directory(p2)) {
cout << p2 << " is a directory,includes: " << endl;
for (auto& e : fs::directory_iterator(p2)) {
cout << " " << e.path() << endl;
}
}
// 判断路径是否存在
else if (fs::exists(p2)) {
cout << p2 << " is a special file\n";
}
else
{
cout << p2 << " does not exist" << endl;
}
cin.get();
}
2、访问路径里文件的组成成分。如包含文件、子目录:
#include<iostream>
#include<filesystem>
using namespace std;
int main() {
namespace fs = experimental::filesystem;
fs::path p1{ R"(E:\Data\Convert)" };
// 是否存在?根名?根路径?相对路径?
if (p1.empty()) {
cout << "Path " << p1 << " is empty." << endl;
}
if (!fs::exists(p1)) {
cout << "Path " << p1 << "does not exist." << endl;
exit(0);
}
cout << "root_name(): " << p1.root_name() << "\n"
<< "root_path(): " << p1.root_path() << "\n"
<< "relative_path(): " << p1.relative_path() << "\n";
// 输出父路径、文件名、文件名主干、扩展名
cout << "parent_path(): " << p1.parent_path() << "\n"
<< "filename(): " << p1.filename() << "\n"
<< "stem(): " << p1.stem() << "\n"
<< "extension(): " << p1.extension() << endl;
cin.get();
}
3、path相关的一些特殊运算符用法:
#include<iostream>
#include<filesystem>
using namespace std;
namespace fs = experimental::filesystem;
int main() {
// 定义路径对象
fs::path p1{ R"(D:\Temp)" };
fs::path p2{ R"(D:\Temp)" };
fs::path p3{ "" };
// append和/=
p1.append(R"(test01)"); // 将test01 目录附加到D:\Temp 目录下。
p1 /= R"(cyd)"; // 操作符 /= 会自动在路径的多个元素之间加上路径分隔符
cout << p1 << endl;
// concat和+=
p2.concat(R"(test02)");
p2 += R"(cyd)"; //操作符 +=与/=的不同在于+=不会在路径元素之间加路径分隔符
cout << p2 << endl;
//用操作符 / 拼接一个新的路径出来,/的第一个左操作数必须是path对象。
p3 = p3 / R"(D:\Temp)" / R"(test01)" / R"(cyd)";
cout << p3 << endl;
cin.get();
}