问题标签 [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 投票
0 回答
279 浏览

c++ - C++17 (std::filesystem) 是否提供与 Boost.Filesystem 相同的错误代码

我正在使用 Boost.Filesystem 为 C++17 Xcode 10.x 中 std::filesystem 的(最终)可用性准备代码。是否有一种跨平台方法可以避免在这两个库之间转换常见的文件系统错误,例如:

no_such_file_or_directory(与 ENOENT 相同)

我希望能够以跨 MacOS、Windows 和 linux 的跨平台方式顺利过渡到 C++17 std::filesystem 支持。

(我看到其他海报为 pre-C++17(pre std::filesystem)编译器创建了自己的表搜索方法,但由于 std::filesystem 是基于 Boost.Filesystem 的,它可以更兼容吗?)

一些额外的想法:

我看到 C++ std::error_condition 是一个 CLASS,它被称为“平台无关”。boost::system::error_condition 是一个类似的类,被认为是“通用的”。

但是大多数 boost 文件系统操作返回一个 boost::system::error_code。

本文很好地解释了我在 c++ std 错误类的 error_code 和 error_condition 之间看到的断开连接。我希望 boost 会是一样的:

http://blog.think-async.com/2010/04/system-error-support-in-c0x-part-2.html

0 投票
1 回答
721 浏览

c++ - 如何测试文件是否被锁定和/或只读而不打开?

是否有一种可移植的(std::filesystem)方法来测试文件是否“锁定”或具有“只读”权限?例如,MacOS Finder 有一个“锁定”设置,它与标准 POSIX 的“权限”不同。

在尝试执行删除操作之前,我需要测试是否可以删除文件。理想情况下,我想避免为 R/W 打开文件作为测试。

这是在 SAVE/RENAME 过程中,并且(至少在过去的 MacOS 文件系统中),即使文件在 Finder 中被“锁定”,操作系统对“交换”两个文件的调用仍然有效。由于围绕如何保存文件以及如何“保留”以前的版本的复杂性,最好提前知道这样可以避免操作。

进一步说明:在具有读写权限的 LOCKED 文件上以 R/W (std::ios::out | std::ios::in) 的形式打开流将失败,并且 errno = 1(不允许操作)。如果文件是只读但未锁定,它将失败并显示 errno 13(权限被拒绝)。

此处讨论了测试锁定位的 MacOS (Cocoa) 特定方法:

如何检查文件是否在 Cocoa 中被锁定?

0 投票
3 回答
2453 浏览

c++ - 将 std::filesystem::path 传递给函数段错误

当我尝试std::filesystem::path用作函数参数时,它会在我的机器上出现段错误。这是一个最小的例子:

此代码段导致 gdb 的以下回溯:

我在 Ubuntu 19.10 上使用 GCC 8.3,我让其他人编译并运行此代码,在 Windows 上没有问题,因此它可能是一个错误libstdc++

0 投票
1 回答
334 浏览

c++ - c++ - 在向量中使用 std::filesystem::path 时双重释放

我正在使用DearImgui开发一个简单的文件浏览器。为此,我将 std::filesystem 与 g++-9 一起使用,目前正在 Kubuntu 19.04 上进行测试。在大多数情况下,该程序按预期工作。一个按钮用于下降到父目录,并且可以通过双击打开子目录。大多数时候,我可以毫无问题地浏览整个文件系统,但是某些命令组合会导致程序中止。确切的错误消息各不相同,但总是与双重释放错误有关。

在将 std::filesystem 添加到我的应用程序之前,我使用的是 g++-8 (Ubuntu 8.3.0-6ubuntu1)。但是,在调用与文件系统相关的内容后,该程序继续出现段错误。这似乎是一个已知问题,应使用 8.3.0-7 (source)修复。与此同时,我决定使用 g++-9 (Ubuntu 9.1.0-2ubuntu2~19.04)。我不确定这是否是我的问题的原因。

这是导致中止的代码:

当使用 Valgrind 运行程序时,它会在更新路径向量和未初始化条件时报告泄漏。尝试将所选路径复制到当前路径时,主要错误似乎是无效读取。

一个可重现的示例需要 SDL2 和 imgui。如果有人感兴趣,我可以发一个。

有趣的是,当我在 gdb 中运行程序并触发中止时,我无法再使用鼠标单击任何内容(甚至是不相关的应用程序,例如 firefox)。我仍然可以使用键盘并通过命令行杀死 gdb。在这个项目中以前没有发生过类似的事情,我无法在程序的无关部分中重现它。这可能是由 Imgui 引​​起的,但我对此表示怀疑。

0 投票
1 回答
4363 浏览

c++ - 如何使用 GCC 9 将 `std::filesystem::file_time_type` 转换为字符串

我正在尝试将文件的修改时间格式化为字符串(UTC)。以下代码使用 GCC 8 编译,但不是 GCC 9。

我尝试了decltype(file_time)::clockand std::chrono::file_clock,同时使用了 C++17 和 C++20,但它们都不起作用。

https://en.cppreference.com/w/cpp/filesystem/file_time_type上的示例提到它不适用于 GCC 9,因为 C++20 将允许可移植输出,但我不知道如何获取它在职的。如果我不使用 C++20,它不应该与 GCC 9 一起使用吗?

如果可能的话,我更喜欢使用 GCC 9 的 C++17 解决方案。

0 投票
1 回答
307 浏览

c++ - 从指定了 std::filesystem::path 对象的类退出时出现分段错误

我在我的程序中遇到了一个我无法克服的问题。我有一个类,我在其中声明了一个属性,例如std::filesystem::path p {"path/to/save/dir"};. 我在同一个类中有一个将一些数据保存到 .txt 文件的方法。首先,我检查一些事情,例如用户是否提供了扩展名,然后是否存在同名文件。因此,如果用户不想覆盖它,我会要求他提供一个新的名称文件。然后我写入文件。所以,问题是,每当程序退出类时,seg fault 就会弹出,特别是 save 方法如果它进入 if 子句,那么它将不会保存,因为它会收到 seg fault。我认为它与类的析构函数和调用路径对象的析构函数有关。

使用 gdb,我得到了这个消息:

到目前为止我尝试过的事情:

  • 我已经尝试显式调用std::filesystem::path 析构函数(我的类现在没有指定析构函数方法)。不工作。
  • 我尝试将路径对象移到类之外,将其“转换”为全局对象。现在,只有当我退出声明类对象 ***** 的 main.cpp 文件时,才会出现此问题。但不是在我退出课堂的时候。
  • 我试图用 clear 方法清除路径,但由于某种我不明白的原因,它不会被调用。所以它什么也没做。

*:

本质上,这是 main.cpp 的一部分。它有一个菜单,后跟一个类似于用户选择的 switch 语句。因此,当它从循环中存在并中断并且我选择退出时,我会收到段错误。

任何帮助都是appriciated,谢谢。

0 投票
0 回答
366 浏览

c++ - 每当 fs::path 被破坏时出现分段错误

每当我运行这段代码时,我都会得到segmentation fault(core dumped). 它编译没有错误或警告,但我仍然得到段错误。

我在 amd ryzen 2400g 上的 Ubuntu 19.04 上运行

我已经在 g++-8 和 clang-8 上编译了它,并且在两者中我都遇到了 seg 错误。在调试它以捕获段错误后,我在 fs::path 的析构函数中找到了它=default

这只是应该打印出运行程序的目录。我尝试运行recusrsive_directory_iterator它以创建目录查看器,但最终出现错误。

0 投票
1 回答
395 浏览

c++ - 对文件系统路径向量进行排序时,“尝试取消引用过去的迭代器”

我正在使用 std::filesystem 编写一个简单的文件选择器。当前目录的条目存储在向量中。当我尝试使用 std::sort 对向量进行排序时,程序崩溃。

这发生在 Ubuntu 19.04 上的 g++-9 上。该文件使用 -D_GLIBCXX_DEBUG 和 -D_GLIBCXX_DEBUG_PEDANTIC 调试标志编译。

相关代码如下所示:

错误消息如下所示:

我在网上看到很多用vector.end() 调用std::sort 的例子。我尝试了它files.end() - 1并收到了相同的错误消息。

0 投票
2 回答
1820 浏览

c++ - std::filesystem::path 和 std::string 之间的隐式转换,应该发生吗?

std::filesystem::path各州的 cppreference 页面:

路径可以隐式转换为 和std::basic_strings,这使得可以将它们与文件 API 一起使用,例如作为std::ifstream::open

现在转换为 a很容易看出,因为它有一个接受类型std::filesystem::path的非显式构造函数。std::string但是,我似乎找不到的是一种std::string隐含的方法。

有一个string功能,但它是std::string string() const;,不是operator std::string()。使用

这段代码可以用iccgccclang编译,但不能用MSVS编译,它会给出错误:

那么,哪个编译器是正确的?是否有隐式转换序列,或者编译器只是有帮助?

0 投票
1 回答
710 浏览

c++ - 如何将 const std::filesystem::directory_entry 转换为 tchar?

我正在尝试将 const std::filesystem::directory_entry (dirent) 转换为 tchar 但我不明白它是如何完成的。我尝试了很多方法。你能帮助我吗?

编辑: