【发布时间】:2021-12-08 23:31:21
【问题描述】:
我试图在我的代码中捕获输入参数中的错误路径并发现了这种行为。 代码示例:
#include <iostream>
#include <filesystem>
using namespace std;
namespace fs = std::filesystem;
int main() {
fs::path p = "/home";
cout << p << endl; // "/home"
cout << fs::exists(p) << endl; // 1
try {
p = p / "../..";
cout << p << endl; // "/home/../.."
cout << fs::exists(p) << endl; // 1
} catch (...) {
cout << "catched" << endl;
}
p = fs::canonical(p);
cout << p << endl; // "/"
cout << fs::exists(p) << endl; // 1
return 0;
}
如何使用标准功能捕获超出根目录的范围?这是错误还是功能?
【问题讨论】:
-
/.. 是 linux 和 windows 上的有效路径,它与只是 /
-
这是一项功能。所有超过 root 的尝试都会被忽略。这就是 FS 的工作原理,并不特定于 C++。
-
您可以通过运行
ls -ai /来简单地检查这一点。你看到/.和/..有相同的inode 号了吗? -
试试这个简单的实验:启动一个终端/命令提示符/shell/任何你想调用它。输入以下命令,看看 shell 如何处理“超出根目录”。
cd /home和cd /home/../..你的程序的行为是否应该不同于标准实用程序的行为?
标签: c++ boost boost-filesystem