std::filesystem current_path 返回根目录

Posted

技术标签:

【中文标题】std::filesystem current_path 返回根目录【英文标题】:The std::filesystem current_path returns the root one 【发布时间】:2020-10-07 12:16:13 【问题描述】:

我只想通过std::filesystem::path::current_path(编译器是emccthis one)打印当前路径及其内容。下面是一些代码:

//... some stuff ...
namespace fs = 
#if defined(_MSC_VER) || defined(_WIN32) 
  std::filesystem;
#else
  std::__fs::filesystem;
#endif
//... some stuff ...
cfg::Config::Config()  this->Path = fs::current_path(); 

void cfg::Config::getPath()

    for (auto &p : fs::directory_iterator(this->Path)) std::cout << p.path() << '\n';

对于 Windows,它工作正常,输出如下所示:

...
"D:\\GitHub\\Emscripten_OpenGL\\build\\cmake_install.cmake"
"D:\\GitHub\\Emscripten_OpenGL\\build\\Debug"
"D:\\GitHub\\Emscripten_OpenGL\\build\\Emscripten_Graphics.dir"
"D:\\GitHub\\Emscripten_OpenGL\\build\\Emscripten_Graphics.sln"
"D:\\GitHub\\Emscripten_OpenGL\\build\\Emscripten_Graphics.vcxproj"
"D:\\GitHub\\Emscripten_OpenGL\\build\\Emscripten_Graphics.vcxproj.filters"
"D:\\GitHub\\Emscripten_OpenGL\\build\\Emscripten_Graphics.vcxproj.user"
...

但是,无论是 Linux 子系统还是带有 Ubuntu 映像的 docker 容器,它都只打印根目录:

application_1  | [100%] Built target Emscripten_Graphics
application_1  | make: make
application_1  | "/tmp"
application_1  | "/home"
application_1  | "/dev"
application_1  | "/proc"

可能是我错过了 Linux 的 std::filesystem 吗?

【问题讨论】:

std::__fs::filesystem; 你不应该使用任何以双下划线开头的符号。你能解释一下你这样做的方式吗?您是否忘记在 Linux 上启用 C++17? 您使用的是哪个版本的GCC?当前版本有std::filesystem,旧版本有std::experimental::filesystem。不过我从没见过std::__fs::filesystem @Marek R 是的,我这样做是因为在其他方面它会引发异常(std::filesystem 未找到,系统建议使用此异常)。我正在使用emcccompiler。 你了解工作目录的概念吗?您希望 Docker 程序在哪个工作目录中运行?您是否在 Dockerfile 中指定了任何 WORKDIR? 如果您使用emcc 版本编译运行 - 它会“挂载”虚拟文件系统,所有内容都从根目录开始,可能就是这种情况。 【参考方案1】:

我找到了一个解决方案,所以它可能对其他人有用。感谢@Sugar 我挖了Emscripten Filesystem API。 emscripten 创建自己的虚拟文件系统并上传 C++ 代码中使用的文件。根据this issue,修复它的方法是在编译时添加-s NODERAWFS=1作为标志。

【讨论】:

以上是关于std::filesystem current_path 返回根目录的主要内容,如果未能解决你的问题,请参考以下文章

ubuntu 18.10 上的 std::filesystem 链接错误 [重复]

std::filesystem::path 的奇怪运算符/

std::filesystem::directory_iterator 链接器问题(C++17)[重复]

`std :: filesystem :: directory_iterator`编译器问题

std::filesystem current_path 返回根目录

不能在使用 make 和 g++ 构建的代码中使用 std::filesystem