问题标签 [std-filesystem]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票
1 回答
2012 浏览

c++ - `std::filesystem::directory_iterator` 编译器问题

很多人(例如12)都问过如何去std::filesystem::directory_iterator上班,但我读完这些后仍然遇到麻烦。

我正在尝试构建一个小型静态库。在将目录迭代器添加到一些源文件中后,我更新了我的 gcc,并添加了-lstdc++fs位,但似乎没有任何效果,因为我不断收到错误消息

如果我输入gcc --version,我会得到

如果我打字gcc-8 --version,我会得到

这是我编译所有内容的小 shell 脚本。我也尝试了其他一些变化。

0 投票
1 回答
2915 浏览

c++ - cmake ist 将静态库(c++fs)不在链接器命令的末尾

我有问题,链接到stdc++fs(std::exeperimental::filesystem) 不起作用。

本质上,我对我的目标有以下调用:

这导致

哪个失败是因为-lc++fs它位于链接命令的中间,而不是最后,因为它是一个静态库?我该如何规避这一点,为什么 cmake 不能正确地做到这一点,这意味着为链接器提供正确的依赖关系,我在这里做错了什么?

输出:

0 投票
1 回答
837 浏览

c++ - 为什么不能从`std::filesystem::path`迭代器构造`std::filesystem::path`?

以下代码旨在剥离路径的第一部分,以防它存在:

(见:https ://godbolt.org/z/wkXhcw )

我很惊讶地发现这不起作用。该代码无法编译,因为路径构造函数仅采用迭代字符序列的迭代器。我可以看到它的用途,但是为什么将构造仅限于那些迭代器呢?在我看来,不支持从自己的迭代器构建路径是违反直觉的。据我所知,大多数其他 STL 类型都支持这个习惯用法。

除了完全重建一条新路径之外,实现相同目标的有效实施方式是什么?

更新:在这种情况下,我发现以下讨论相关/有趣:http ://boost.2283326.n4.nabble.com/boost-filesystem-path-frustration-td4641734.html 。我同意戴夫的观点。我认为将路径视为路径元素的容器是一种非常自然的看待它的方式(从程序员的角度来看)。

0 投票
2 回答
428 浏览

c++ - 是 C++17 std::filesystem::recursive_directory_iterator::pop 等于 boost::filesystem::recursive_directory_iterator::no_push

由于 C++17std::filesystem与 非常相似boost::filesystem,我试图做这个问题中提出的同样的事情:Escaping some Directories in iteration

但是我发现在std::filesystem::recursive_directory_iterator没有no_push实现的方法中,最接近的匹配是pop方法,但是它们在功能上完全相等吗?

0 投票
1 回答
1859 浏览

c++ - 使用 Xcode 为 std::filesystem 链接到什么库

Xcode 10.2 现在包含<filesystem>标头。但是,在使用 编写代码时std::filesystem,我遇到了很多额外的链接错误。

我相信需要链接一个额外的库来支持文件系统,但我无法确定它是什么或在哪里。知道它叫什么吗?

编辑:libc++ 说这libc++fs是必需的——但是,这似乎没有随 Xcode 一起分发,至少不在默认搜索目录中。

0 投票
1 回答
2844 浏览

qt - Qt 如何避免 std::filesystem 链接器错误?

我想将std::filesystemQt 5.12.0 与 g++ 版本 Ubuntu 8.2.0-7ubuntu1 一起使用,但出现链接器错误:

经过一番谷歌搜索,我发现我需要使用链接器标志-lstdc++fs。我的代码使用命令完美构建g++ main.cpp -std=c++17 -lstdc++fs,但我似乎无法使其在 Qt Creator 中工作。我的简单测试代码如下:

我的 .pro 文件如下所示:

在使用 g++ 进行一些测试后,在我看来,问题是由 g++ 标志的顺序引起的,因为 Qt 将 放在-lstdc++fs前面。

  • 为什么我还需要使用这个标志?我认为 g++8 已经支持 C++17 并且只有在我想使用std::experimental::filesystem.
  • 我怎样才能在 Qt Creator 中构建我的代码?
0 投票
2 回答
617 浏览

c++ - 可以使用 filesystem::canonical 来防止传递给 fstream 的文件路径的文件路径注入吗

我有一个公用文件夹pub,其中包含子文件夹和文件。用户现在给了我一个相对文件路径,我执行一些映射,然后我读取文件fstream并将其返回给用户。

现在的问题是,如果用户给我一个路径,例如../fileXY.txt,或者考虑到路径遍历或其他类型的文件路径注入的其他一些花哨的东西。fstream只是会接受它并读取我的公共pub文件夹之外的潜在文件,或者更糟糕的是给他们我系统上所有文件的列表等......

在重新发明轮子之前,我搜索了文件系统库,我看到有这个std::filesystem::canonical函数,并且有很多关于正常形式的讨论。我在这里有一个普遍的问题,这个函数和变体std::filesystem::weakly_canonical可以用来防止这种类型的漏洞吗?所以基本上够了吗?

此外,我系统的文件系统库仍处于实验模式,并且std::filesystem::weakly_canonical丢失了。但我不能使用,canonical因为文件必须存在于canonical. 就我而言,我有某些映射,并且文件在这种意义上不存在。所以我需要模仿这个weakly_canonical功能,但是怎么做呢?

我在realpath 上看到了有关不存在路径的相关 stackoverflow 问题,建议他重复规范,只要路径存在,然后将不存在的部分添加到其中,但这又容易受到此类注入的攻击。那么我必须自己动手weakly_canonical还是可以通过组合一些功能以某种方式模仿它std::experimental::filesystem

0 投票
1 回答
8352 浏览

c++ - 获取可执行文件的路径(使用 std::filesystem)

在我被标记为重复之前,我能找到的所有类似问题在引入 std::filesystem 之前都有答案,并且可以使用特定于平台的代码或 Boost::filesystem。我正在寻找一个使用 std::filesystem 的便携式答案。


是否可以使用 std::filesystem 获取 c++ 可执行文件所在的路径(不是工作目录)?如果是,怎么做?

0 投票
2 回答
945 浏览

c++17 - Python 绑定使用 pybind11 和 std::filesystem 作为函数参数给出 TypeError

我有一个类 Foo() 并且类 Foo() 有一个具有以下声明的函数:

bool Foo::copyFile(const std::filesystem::path& src, const std::filesystem::path& dest)

要求是类 Foo 应该具有 Python 绑定。我正在使用 pybind11 创建 Python 绑定。

我编写了以下内容来创建 Python 绑定:

这可以编译,我可以创建 Python 绑定 pyd 文件。当我使用 Foo 类的 Python 绑定时,使用:

它给出了一个 TypeError。我怀疑它与 pybind11 对 c++17 中 std::filesystem 的支持有关,因为我没有看到具有std::stringor的类的其他函数会发生这种情况std::vector

我得到的错误是:

我是 pybind11 的新手。有人可以帮我解决这个问题吗?

0 投票
1 回答
326 浏览

c++ - `std::filesystem::path::operator/(/*args*/)` 没有按预期工作

我在构造函数中有一个带有初始化列表的类,其中我正在初始化的字段之一是 astd::filesystem::path但它似乎没有初始化为预期值。

使用调试器,我可以看到它GetBasePath()返回的正是我所期望的(返回std::filesystem::path正确的路径),但/操作员似乎没有效果。一旦进入构造函数的主体,我可以看到它configFilePath设置为GetBasePath()没有附加额外信息的结果。

我正在使用 MSVS-2019,我将 C++ 语言标准设置为 C++17,并且在调试模式下我禁用了所有优化。

我还在课程正文中测试了以下内容,我仍然认为path只是结果,GetBasePath()并且没有附加额外的项目。

顺便说一句,我还尝试了上面的测试,+=而不是,/=我仍然看到相同的结果。

编辑

根据要求,以下是一个最小的完整且可验证的示例。