问题标签 [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 回答
612 浏览

c++ - 使用 std::filesystem 替换文件

经常有一个模式

  1. 将输出写入临时文件(bla.txt.tmp)
  2. 删除原始文件(rm bla.txt)
  3. 重命名一个新的(bla.txt.tmp -> bla.txt)

std::filesystem 中是否有任何实用程序函数可以执行此操作,或者我需要使用重命名和删除来逐个执行步骤。

0 投票
1 回答
136 浏览

c++ - 文件系统路径字符串方法返回混合的 \ 和 /

我有一个 C++ 程序,我在其中使用递归迭代器来遍历我作为参数提供给程序的文件夹。

问题是当我在路径上调用 .string 时,我得到混合的 \ 和 / 在路径中。使用 .generic_string 解决了这个问题,但我想知道这是 VS2019 中的错误还是允许的行为。

举一些例子:我将 a/b 作为我的程序的输入。

当我遍历所有文件并使用 .string 打印它们时,我得到

a/b\c\bla.txt

a/b\d\lol.txt

当我使用 .generic_string 我得到

a/b/c/bla.txt

a/b/d/lol.txt

0 投票
1 回答
1231 浏览

c++ - Clang 拒绝编译 libstdc++ 的标题

考虑这个最小的例子:

它在 GCC 9.2 中按预期工作,但 Clang 8.0.1 拒绝编译<filesystem>头文件(来自 GCC 9.2 的 libstdc++):

它是 Clang 错误还是 libstdc++ 错误?

我在 MSYS2 错误跟踪器上找到了这个错误报告,但那里没有有用的信息。

<filesystem>在我们等待官方修复时,有没有办法修补标头以消除此错误?


我在 Windows 上。我正在使用 MSYS2 包中提供的最新 GCC 和 Clang。

GCC 标识为:

Clang 标识为:

Clang 使用这个 GCC 附带的 libstdc++。

0 投票
1 回答
1261 浏览

c++ - [LLVM-9 clang-9 OSX]:std::filesystem::path 无法识别

您好,在 OSX Mojave 上升级到 LLVM-9 版本后,使用brew upgrade llvm

我收到以下错误:

我的代码:

这是正常的吗?

0 投票
2 回答
1755 浏览

c++ - std::filesystem 根路径如何将自己作为父路径?

这个程序:

产生这个输出:

编辑:我对正斜杠的使用感到困惑,所以我更新了这段代码以显示无论您在 Windows 上使用哪种路径分隔符都会发生同样的事情)

这对我来说毫无意义。目录如何成为其自身的父级?如果它永远不会返回 false,那么即使有一个“has_parent”函数又有什么意义呢?

最重要的是:如果我正在编写递归搜索目录树以查找文件的代码,那么检测我已经点击根文件夹并应该停止的最佳/最可靠的方法是什么?

(如果重要的话,我在 C++17 语言模式下使用 Visual Studio 2019)

0 投票
1 回答
412 浏览

c++ - *--end() 在 C++ 中是什么意思?

查看此 cppreference.com 页面std::filesystem::path::filename该方法的描述实际上只是“等效于relative_path().empty() ? path() : *--end()”。我从未见过这种语法“*--end()”。我可以从上下文中弄清楚它的作用,但它到底是什么意思?并且可以在不同的上下文中使用它来提取子字符串吗?

0 投票
2 回答
2425 浏览

character-encoding - 使用 std::filesystem::path 处理 std::string/std::wstring 的跨平台方法

我有一段在 Linux 上引发异常的 C++ 代码示例:

抛出的异常是:filesystem error: Cannot convert character sequence: Invalid in or incomplete multibyte or wide character

我推测这个问题与ç角色的使用有关。

  1. 为什么这个宽字符串 (wchar_t) 是“无效或不完整的多字节或宽字符”?
  2. 展望未来,我如何使相关代码跨平台运行在 Windows 和/或 Linux 上。
    • 我需要使用辅助功能吗?
    • 我需要从程序员的 PoV 中强制执行哪些规则?
    • 我在这里看到一个回复​​说“不要在 Linux 上使用宽字符串”,我是否对 Windows 使用相同的规则?

Linux 环境(不要忘记我想跨平台运行的事实):

  • Ubuntu 18.04.3
  • GCC 9.2.1
  • C++17
0 投票
1 回答
303 浏览

c++ - llvm 9 在 10.15 之前的 mac 版本上支持 std::filesystem 吗?

我有一台运行 El Capitan 版本 10.11.6 的旧 Mac(大约 2009 年)。Apple 不允许在我的机器上进一步更新其操作系统,但通过 Macports,它可以作为非 Apple 特定软件的良好开发环境。

我正在使用 g++ 9.2 进行编译,它支持开箱即用的 std::filesystem,而使用不支持的 clang 8.0。(在每种情况下都使用每个编译器的本机标准库。)我正在使用 --std=c++2a 进行编译。

我注意到 llvm 9 应该支持开箱即用的 std::filesystem ( https://libcxx.llvm.org/docs/UsingLibcxx.html#using-filesystem ),所以我通过 Macports 下载了 clang/llvm 9 . 不幸的是,我遇到了障碍。

重现错误的最少代码是对 cppreference.com ( https://en.cppreference.com/w/cpp/filesystem/path/path )示例的简化

这是 CmakeLists.txt

这是编译器的抱怨:

向后工作,我在 /opt/local/libexec/llvm-9.0/include/c++/v1/__config 中找到了这段代码:

据我所知,这个#define 是上述错误信息的最终原因。

所以,我的问题是:

  • 这是 LLVM 的错误吗?毕竟,GCC 不会在 std::filesystem 和操作系统版本之间引入依赖关系。
  • 这是 Macports 的错误吗?也许他们在构建时没有使用正确的标志?
  • 如果我要本地构建 LLVM 和 Clang,我可以解决这个问题吗?
  • 这是一个问题吗?也许 LLVM 的好人知道一些 GCC 的好人不知道的事情。

注意:有一个类似的问题涉及通过 Homebrew 下载的 clang/llvm。不幸的是,评论没有帮助。 [LLVM-9 clang-9 OSX]:std::filesystem::path 无法识别

0 投票
1 回答
2670 浏览

xcode - 使用 C++17 std::filesystem 是否需要 MacOS 10.15?(Xcode 11.1)

使用 Xcode 11.1,在 MacOS 10.14.6 (Mojave) 上构建,以下行:

...生成此编译器错误:

这是否意味着我无法从 10.14 构建早期版本的 MacOS(10.13、10.14),或者我无法从 10.15 生成可以在 10.15 之前的 MacOS 版本上定位/运行的可执行文件?

0 投票
0 回答
308 浏览

c++ - 带有 std::__shared_ptr 的多定义链接器错误

语境

操作系统:Ubuntu 18.04

建造:CMake 3.10.2

编译器:gcc-9 (Ubuntu 9.2.1-17ubuntu1~18.04.1) 9.2.1 20191102

配置:x86_64,debug

行动

我升级到上述 gcc 版本并使用此编译器重新编译了所有第三方库和我的整个应用程序代码。所有库和应用程序都使用 编译-m64 -std=c++17,应用程序使用-stdc++fs

使用 GCC-8,一切都构建得很好,但是运行整个事情会导致 SEGFAULT at std::filesystem::current_path()after doing apt update, apt upgrade.

在此之前,整个应用程序已经成功运行。

错误

我收到后续的多个定义链接器错误(+ 一个未定义的引用错误)

更多上下文

COLLECT_GCC_OPTIONS 输出为:

备注:我有一个更大的静态库列表,它们链接到一个公共共享对象中。之后的任何 -l 选项-dl都由 CMake 附加,我不设置它们。

我已经做了什么

  • 当我从 GCC-8 升级时,我删除-lstdc++fs并替换了所有出现的#include <experimental/filesystem>with#include <filesystem>并更新了所有引用和命名空间用法
  • 我删除了所有第三方源、构建文件和部署输出并重新获取源并从头开始完全重建
  • 我清理了标头包含和源,删除了未使用的包含、定义和函数等 --> 没有效果
  • 我分析了链接器错误并进nlohmann::json入库并搜索了 std::shared_ptr<std::filesystem ...--> 没有发现
  • .o我分析了受列出的三个文件影响的源代码和它包含的代码。--> 没有 std::shared_ptr<std::filesystem ...找到
  • 我检查了所有隐式转换std::filesystem::...std::shared_ptr<...--​​>没有找到
  • 我浏览了我最近更改的所有文件以查找错误<>以及任何语法关键字-> 没有找到
  • 我在 SO 上浏览了许多关于多个定义错误的帖子,随后确保所有内容都是使用相同的编译器和选项构建的。-->Unsolved

短的

我无法解释为什么代码失败。

停!

我被困在这一点上。有没有人事先遇到过这样的问题?

我很感激有关如何追踪此问题的任何线索。

更新

按照 nm 的建议,我执行了nm -C extraction.cpp.o | grep _Dir

是的,弱符号...

更新 2

似乎是我使用的 GCC-9 的非官方发行版中的编译器错误。回到 GCC-8 并进行了一些修复,问题得到解决。


为了获得更好的 PHP 7.3 体验,您可以简单地将其升级到 Laravel 5.2。它适用于 PHP 7.3 环境。