问题标签 [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.
c++ - 使用 C++ 标准库模拟 mkdir -p
这个问题:mkdir c++ function告诉我们如何在 C++ 中以编程方式创建目录,向我们介绍std::filesystem::create
- 它的作用类似于mkdir
Unix shell 中的命令。
但是,这似乎不允许递归地创建整个路径:mkdir -p /path/to/nonexisting/dir/and/then/some
. 文件系统库中是否有一些工具可以做到这一点?或者 - 我们是否应该只遍历路径元素,根据需要检查存在和可写性?
c++ - std::filesystem::path 的奇怪运算符/
结果是 c:PosteClient.log 而不是 c:\PosteClient.log
这对我来说是一种奇怪的行为,因为无法使用 Windows 上的结果,例如
CreateFile("c:PosteClient.log")
ERROR_FILE_NOT_FOUND 失败。
我在文档中找不到这种行为的原因,但从示例中看起来这是预期的行为。https://en.cppreference.com/w/cpp/filesystem/path/append
我想了解为什么会出现这样的行为,以便为我的代码找到合适的解决方案,该解决方案适用于使用此运算符的所有场景
好的,让我们更准确地说,假设我有以下代码:
工作目录是
C:\SRC\ConsoleApplication3\
当我现在调用此代码时
该函数成功,因为结果路径是“c:\test.log”
该函数失败,因为结果路径是“c:test.log”
我无法控制来电者。当然,在这里进行检查并手动添加分隔符很容易,但这意味着我可以一直自己做,不需要操作员,或者更准确地说,我自己添加更安全,因为这将适用于所有情况,运算符/适用于所有人,除非有人使用没有反斜杠的驱动器号调用。我只想了解为什么该功能会这样工作,因为我认为有一个我目前看不到的原因
c++ - 对 C++17 Filesystem::last_write_time 的向量进行排序的问题
我在尝试按上次写入时间对文件向量进行排序时遇到问题。排序似乎按预期工作,但有时即使时间字符串显示更高的日期,time_t 也会更低。
示例输出:
我的代码:
c++ - 使用 std::filesystem 和多线程搜索文件
我编写了一个程序,使用 std::filesystem 在系统上按名称搜索文件(使用 std::filesystem::recursive_directory_iterator 进行递归搜索)。如果我只使用一个主线程,执行时间约为 1 秒,如果我从 Linux 上的根(“/”)目录开始,它可以正常工作。问题:当我尝试使用多个线程运行该程序时,我得到了中止(核心转储)和文件系统错误:递归目录迭代器无法打开目录:不是目录。我想运行该功能
同时在 8 个线程中但具有不同的参数(路径参数将是另一个)。我尝试以这种方式实现多线程:计算系统上所有现有文件的数量,然后将这个数字除以线程数,并给每个线程入口目录以开始搜索。我也有自己的类来处理名为 SearchFile (sf) 的文件。下面列出的代码:
一个线程的第一种方法(它按我的需要工作):
我使用的 SearchFile 方法:
主文件
也许这不是解决我问题的好方法,但我只是一个初学者。
c++ - 如何递归复制文件夹和文件而不损失文件修改时间?
我正在寻找一种简单的方法来递归复制文件夹而不会丢失文件和文件夹的时间戳。我发现std::filesystem::copy
如此简单易用,但它将文件修改时间设置为现在。
c++ - directory_entry 的输出与具有变体的类的重载 ostream 运算符<< 冲突
我有一个std::filesystem::directory_entry
从 directory_iterator 打印的项目。另一方面,我有一个完全独立的类重载std::ostream& operator<<
,它有一个模板化的构造函数,它初始化一个std::variant
成员。
编译失败:
它似乎在将其发送到 之前尝试包装directory_entry
到,但我不确定。Var
cout
您能否解释一下实际发生了什么以及为什么代码是错误的?
我四处测试。对于这个问题,无论我投入什么似乎都可以variant
,即使是单个变体也有问题。这个
工作正常。如果我将_value
初始化移动到 c-tor 主体编译失败并出现相同的逻辑错误,但对于operator=
,至少它是一致的。显然它适用于非模板化的 c-tor。
如果我将 的实现ostream& operator<<
移到一个单独的单元中并将其定义为 的朋友Var
,则编译通过(这是一种合适的解决方法,但不应该operator<<
可以访问类的私有)。但是,如果我只是分开而不交朋友,它就失败了。
主.cpp:
var.hpp:
var.cpp:
这让我完全迷失了。假设它尝试Var
在这里调用 c-tor<<
应该没有区别。
为什么这样的改变很重要?
我用 g++8.4 构建(g++ -std=c++17 main.cpp var.cpp -lstdc++fs
我也尝试了 clang7.0 并获得了类似的结果)。
c++ - Mingw 或 msvc 中的 std::filesystem::relative 错误?
我截断了以下代码,它在 mingw(gcc) 和 msvc 上产生以下输出:
明格(GCC):
msvc:
gcc 和 clang(都在 linux 上执行):
在我看来它应该是""
or "../../D:/home/freddy"
,因为在 root_paths 上没有相对路径,但没有擦除根路径的相对路径。
此外,当驱动器不存在时,MSVC 将失败,因为驱动器“尚未准备好”:
weakly_canonical: Das Gerõt ist nicht bereit.: "D:/home/freddy"
这也似乎是一个 MSVC 错误std::filesystem::weakly_canonical
c++ - Mingw 错误?:当文件存在时,std::filesystem::copy 失败并出现文件系统错误,即使定义了覆盖现有的 copy_option
MINGW v. 8.0
-- C 编译器标识是 GNU 10.2.0
-- CXX 编译器标识是 GNU 10.2.0
-- 检查工作 C 编译器:P:/MSYS2/mingw64/bin/gcc.exe
-- 检查工作 C 编译器:P:/MSYS2/mingw64/bin/gcc.exe - 工作
试图运行:
给出以下输出:
使用 msvc:
使用以下命令运行 CMake:P:\MSYS2\mingw64\bin\cmake.exe -DCMAKE_BUILD_TYPE=Debug -G "CodeBlocks - MinGW Makefiles" C:[***]\test_fs
有人也可以重现这个吗?
c++ - 当 filesystem::path 被破坏时程序崩溃
以下程序崩溃:
汇编:
在 Ubuntu 20.04 上测试,编译器是 GCC 8.4.0。
Valgrind,这是切割的输出:
完整输出
我什至不知道为什么调用向量 dtor?我只创建一个path
变量,没有vector<path>
。
c++ - std:: 在 C++/17 中没有成员“文件系统”
我正在尝试包含<filesystem>
,但是当我使用命名空间时,它会显示此错误:
std:: 没有成员“文件系统”
我知道在旧时代它是<experimental/filesystem>
,命名空间是 std::experimental::filesystem;
但是,当我这样做时,它也会给出这样的错误:
我正在使用 Visual Studio 2019,并且 C/C++ 语言设置设置为最新版本。
那么是什么导致了这个问题呢?
编辑1:导致错误的所有代码:
编辑2:所有旧代码,也有错误:
编辑 3:Visual Studio 2019 项目配置设置 -> 常规属性:
平台工具集:Visual Studio 2019 (v142) C++ 语言标准:ISO C++17 标准 (std::c++17) Windows SDK 版本 10.0(最新安装的版本)