标签: std-filesystem

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

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

#include <chrono>
#include <filesystem>
#include <iomanip>
#include <iostream>
#include <sstream>

namespace fs = std::filesystem;

int main() {
    fs::file_time_type file_time = fs::last_write_time(__FILE__);
    std::time_t tt = decltype(file_time)::clock::to_time_t(file_time);
    std::tm *gmt = std::gmtime(&tt);
    std::stringstream buffer;
    buffer << std::put_time(gmt, "%A, %d %B %Y %H:%M");
    std::string formattedFileTime = buffer.str();
    std::cout << formattedFileTime << '\n';
}
Run Code Online (Sandbox Code Playgroud)

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

$ g++-9 -std=c++2a -Wall -Wextra -lstdc++fs file_time_type.cpp

file_time_type.cpp: In function ‘int main()’:
file_time_type.cpp:12:50: error: ‘to_time_t’ …
Run Code Online (Sandbox Code Playgroud)

c++ std-filesystem gcc9

9
推荐指数
1
解决办法
3424
查看次数

如何使用 std::filesystem::path 正确处理带有长路径前缀的 Windows 路径

std::filesystem::path似乎不知道Windows 长路径 magic prefix。这是每个设计还是有可以使用的模式/标志/编译器开关/第三方库?

  • 对于像 之类的路径C:\temp\test.txtroot_nameisC:root_pathisC:\都是有效路径,但是
  • 因为\\?\C:\tmp\test.txt他们是\\?并且\\?\

我希望它们是C:C:\因为\\?\它不是路径,而只是一个用于解决旧版 Windows 260 字符路径限制的标签。

请参阅compilerexplorer 上的完整示例

c++ windows c++17 std-filesystem long-path

8
推荐指数
1
解决办法
4478
查看次数

可以使用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功能以某种方式模仿它?

c++ std-filesystem

7
推荐指数
1
解决办法
143
查看次数

std::filesystem 的parent_path() 对于当前目录中的文件是错误的?

传统的 Unix shell 实用程序dirname查找包含给定文件的目录的名称。如果您想在同一目录中查找其他姐妹文件,这非常有用。这里有一些例子:

$ dirname /some/dir/filename
/some/dir
$ dirname dirname/filename  
dirname
$ dirname filename
.
Run Code Online (Sandbox Code Playgroud)

新的 C++ std::filesystem 的parent_path()最后一个错误(或者看起来是这样):

$ dirname /some/dir/filename
/some/dir
$ dirname dirname/filename  
dirname
$ dirname filename
.
Run Code Online (Sandbox Code Playgroud)

输出:

parent of filename: ""
Run Code Online (Sandbox Code Playgroud)

返回空字符串而不是“.” 不仅与传统的不同dirname,当在想要在此父级上添加“/...”以创建姐妹文件的名称的代码中使用时也是错误的 - 这会导致错误的“/sister”而不是预期为“./妹妹”。

这是 std::filesystem 中的错误还是故意行为?这种行为的原因是否记录在某处?

c++ c++17 std-filesystem

7
推荐指数
1
解决办法
127
查看次数

Clang 拒绝编译 libstdc++ 的 &lt;filesystem&gt; 头文件

考虑这个最小的例子:

#include <filesystem>
#include <iostream>

int main()
{
    std::cout << std::filesystem::current_path() << '\n';
}
Run Code Online (Sandbox Code Playgroud)

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

# clang++ 1.cpp -std=c++17
In file included from 1.cpp:1:
In file included from Z:\Lander\msys2\mingw64\include\c++\9.2.0\filesystem:37:
Z:\Lander\msys2\mingw64\include\c++\9.2.0\bits/fs_path.h:636:31: error: invalid use of incomplete
      type 'std::filesystem::__cxx11::filesystem_error'
      _GLIBCXX_THROW_OR_ABORT(filesystem_error(
                              ^~~~~~~~~~~~~~~~~
Z:\Lander\msys2\mingw64\include\c++\9.2.0\x86_64-w64-mingw32\bits/c++config.h:177:49: note: expanded
      from macro '_GLIBCXX_THROW_OR_ABORT'
#  define _GLIBCXX_THROW_OR_ABORT(_EXC) (throw (_EXC))
                                                ^~~~
Z:\Lander\msys2\mingw64\include\c++\9.2.0\bits/fs_fwd.h:61:9: note: forward declaration of
      'std::filesystem::__cxx11::filesystem_error'
  class filesystem_error;
        ^
1 error generated.
Run Code Online (Sandbox Code Playgroud)

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

c++ clang libstdc++ std-filesystem

6
推荐指数
1
解决办法
1059
查看次数

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

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

#include <filesystem>
typedef std::filesystem::path my_path;
Run Code Online (Sandbox Code Playgroud)

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

'path' is unavailable: introduced in macOS 10.15
Run Code Online (Sandbox Code Playgroud)

这是否意味着我无法从 10.14 开始为较早版本的 MacOS(10.13、10.14)构建,或者我无法从 10.15 生成可执行文件,该可执行文件可以针对/在早于 10.15 的 MacOS 版本上运行?

xcode c++17 std-filesystem macos-mojave macos-catalina

6
推荐指数
1
解决办法
2192
查看次数

调用 std::filesystem::copy() 时可能返回哪些错误代码?

我似乎找不到可能传递到 的ec参数中的错误代码列表std::filesystem::copy

cppreference.com 似乎表明错误代码是特定于操作系统的。
查看Microsoft 文档(因为我对 Windows 错误代码特别感兴趣,尽管我确信其他操作系统的资源对其他人会有帮助),它看起来几乎像是相同源文档的复制/粘贴,没有任何附加信息任何 Windows 特定的内容。

我的猜测是,错误代码将与此处列出的错误代码相同,但是没有关于哪些错误代码与文件系统相关的信息,或者更具体地说与函数相关的信息copy()(超出了有根据的猜测)。

有谁有关于可能返回的潜在错误代码的任何资源,或者,如果我必须以困难的方式执行此操作(并手动尝试并检查不同的错误情况),我如何知道我是否有详尽的列表?

c++ error-code std-filesystem

6
推荐指数
1
解决办法
5511
查看次数

从 std::filesystem::directory_iterator() 获取最后一个文件名而不迭代?

我正在尝试获取最后一个文件名。下面的代码非常优雅。但它正在遍历目录中的所有文件。 是否可以在不迭代的情况下获取最后一个文件?

#include <filesystem>
std::string latestFileName;
for (const auto &entry : fs::directory_iterator("/media/jai/Entertainment"))
      latestFileName = entry.path();
std::cout << latestFileName << std::endl;
Run Code Online (Sandbox Code Playgroud)

已编辑:目录中的文件已按字母顺序递增。我想选择最新的文件,它已经确定是按字母顺序排列的最后一个文件。由于可能有数百万个文件,我试图避免迭代。

c++ c++17 std-filesystem

6
推荐指数
1
解决办法
201
查看次数

如何使用 std::filesystem 来查看我是否具有写访问权限?

我想用来std::filesystem查询提供给我的函数的磁盘文件夹路径。我想知道我是否有该文件夹的写入权限。但我想在不实际尝试写入文件夹的情况下执行此操作。

最后一个要求部分是因为

  • a) 我不想更改文件夹上文件系统的上次写入时间
  • b)如果可能的话,我想学习如何仅通过以某种独立于平台的方式查询文件系统来做到这一点

看来这std::filesystem::status()就是我想要的功能。然而,该函数返回的权限标志包括owner_writegroup_writeothers_write

我如何知道其中哪一个适用于我?我不知道我的应用程序/用户是所有者、组还是“其他”。can_i_write_to_this_folder()某处是否有某种功能正在运行?

我能找到的唯一与此相关的线程没有涉及的答案<filesystem>

[编辑] 人们似乎认为我正在寻找一些不切实际的可写性保证。我不是。我并不认为任何文件系统功能都是万无一失的。我不会将某些关键任务系统建立在这个决定的基础上

<filesystem>他们过来给我们所有的东西directory_iterator和其他好东西时,他们所宣传的目的是有用的。所以当我发现这是真的时,我评估了它们并使用了它们。就像我对std::atomic<>参数包和std::variant许多其他东西所做的那样。我想我们都同意,多年来添加了一些东西,但事实证明并不是那么好。

现在,该库宣传了此功能,filesystem::status()旨在告诉我们(除其他外)文件或文件夹的权限。我想知道这个“访问”信息是否有任何实际用途。

共识似乎是事实并非如此。

c++ std c++17 std-filesystem

6
推荐指数
0
解决办法
3242
查看次数

std::filesystem:: 与不存在文件等效的版本

我的程序应该创建两个具有用户指定路径的文件。我需要知道路径是否通向同一位置,以便在开始更改文件系统之前以错误结束。

由于路径来自用户,因此它们应该是非规范且奇怪的。例如,它们可能是./dir1/subdir/file,并且符号链接dir2/subdir/../subdir/file在哪里并且还不存在。预期的结果仍然是,它们是等价的。dir2dir1subdirtrue

std::filesystem::equivalent仅适用于已存在的文件。有没有类似的功能,没有这个限制?

c++ c++17 std-filesystem

6
推荐指数
1
解决办法
877
查看次数