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

c++ - 重命名用户指定目录中的所有文件

所以我希望能够自动重命名用户指定目录中的所有文件(我知道 c++ 不是执行此操作的最佳语言/工具)。

例如,一个目录当前包含数百个具有随机字符名称的文件,我希望将它们全部更改为

8 月 1 日、8 月 2 日、8 月 3 日等

编码

用户指定这样的目录

目录是这样打开的(使用dirent.h

在此处重命名指定目录中的所有文件

一切正常,直到 while 循环似乎什么也没做,这就是我坚持的部分。

然而,奇怪的是,这个 while 循环旨在显示目录的内容(使用与非工作循环相同的逻辑和语法)完美地工作

Win7上使用MSVS2012


我想我会遇到的另一个问题是,在目录中,不同的文件具有不同的扩展名(这可能可以通过保存原始名称的最后 4 个字符并将其附加到新名称来解决,但不是当然,我们将不胜感激帮助)。

0 投票
0 回答
154 浏览

c++ - boost::filesystem 和 std::filesystem 有多相似?

我相信boost::filesystem至少是用于std::filesystem为 C++17 设计的“源”库之一。

它们有多相似?如果非常相似,已知的问题和不兼容性是什么?如果不是,它们在哪里相似?

这是在使用或实现某些东西的上下文中std::filesystem,并且想知道如果我们切换库(例如,如果发现特定平台上的库不足)可能需要的工作范围。std::experimental::filesystemboost::filesystemstd

这不是对替代图书馆推荐的请求。

0 投票
1 回答
109 浏览

c++ - 复制文件时是否可以自动创建不存在的目录?

我正在试验新std::filesystem图书馆。我希望制作一个程序,将用户列出的文件复制到给定目录中。std::filesystem::copy但是当列出的文件位于子目录中时,使用或std::filesystem::copy_file不起作用的天真方法。

例如,假设我想复制一些文件(some directory),比如说

进入(some other directory),所以我得到

该目录(some directory)可能包含不需要复制的文件或目录等。如果我使用 just std::filesystem::copy,则file1.ext成功,但files2.ext在没有时失败(some other directory)/subdir

解决方法是

  1. 调用std::filesystem::path::remove_filename以获取目录路径。
  2. std::filesystem::create_directories如果目录不存在,则调用创建目录。
  3. 调用std::filesystem::copy以复制所需的文件。

我想知道是否有可能只用一个电话就可以采用这种 3 步方法。谢谢你。

0 投票
4 回答
979 浏览

c++ - 为什么 std::filesystem 提供了这么多非成员函数?

例如考虑 file_size。要获取我们将使用的文件的大小

这没什么错,如果它是普通的 C,但被教导 C++ 是一种 OO 语言 [我知道它是多范式,向我们的语言律师道歉 :-)] 感觉如此......势在必行(颤抖)对我来说,我已经开始期待对象了

反而。这同样适用于其他功能,例如resize_fileremove_file甚至更多。

你知道为什么 Boost 会std::filesystem选择这种命令式风格而不是对象式风格吗?有什么好处?Boost提到了规则(在最底部),但没有理由。

我正在考虑固有问题,例如ps state afterremove_file(p)或错误标志(带有附加参数的重载),但是这两种方法都没有解决这些问题。


您可以使用迭代器观察到类似的模式,现在我们可以(应该?)做begin(it)而不是it.begin(),但在这里我认为基本原理是更符合非修改next(it)等。

0 投票
2 回答
6124 浏览

c++ - 什么是 C++17 等价于 boost::filesystem::unique_path()?

std::filesystem在 C++17 上,以及std::experimental::filesystem对于许多 C++17 之前的编译器,都基于boost::filesystem并且几乎所有这些都可以明显地移植到较新的 std。

但我认为没有std::filesystem等同于boost::filesystem::unique_path().

std 中是否有我没有注意到的等价物?或者有没有推荐的方法来模仿实现?

boost::filesystem当我的代码注意到它在支持的平台上编译时,我真的希望替换依赖项std::filesystem,并且unique_path()是我转换中唯一不明显的部分。

0 投票
1 回答
2068 浏览

c++ - 如何从 std::filesystem::path 中删除引号

如果我使用这样的函数,absolute()我总是会得到一个包含引号的路径。

文件系统函数中有没有办法删除这个引号,使其能够与例如 std::ifstream 一起使用?

返回:

我需要

反而。

手动做是没问题的,但是我想问一下filesystem lib里面有没有方法。

0 投票
0 回答
343 浏览

c++ - 如何更改 std::filesystem::temp_directory_path() 在 Windows 中返回具有 8.3 别名的路径的行为

在 Visual Studio 2015 中temp_directory_path()使用:std::experimental::filesystem

输出:

是否可以获取完整路径名C:/Users/Administrator/AppData/Local/Temp/而不是8.3 别名

使用 Visual C++,调用fs::temp_directory_path()例如_Temp_get(wchar_t (&)[_MAX_FILESYS_NAME]). C:\Program Files (x86)\Microsoft Visual Studio 14.0\VC\include\filesystem但是,该功能的来源似乎不可用。

0 投票
1 回答
1238 浏览

c++ - std::experimental::filesystem::recursive_directory_iterator 跳过文件夹及其子文件夹

我需要将文件递归搜索到一个目录及其子目录中,但我想从搜索中排除一个路径(及其文件和子目录)。

我正在使用std::experimental::filesystem::recursive_directory_iteratorpop()修饰符,但它不起作用。我哪里错了?

0 投票
1 回答
497 浏览

c++ - 如何替换从 boost::filesystem::weakly_relative 和 std::filesystem::canonical 中删除的基本参数

该函数boost::filesystem::canonical()1.66文档,当前版本的文档)提供了两个参数(忽略错误代码重载)base。第一个是规范化的路径,第二个参数是基本路径,如果它是相对的,则用于使第一个路径成为绝对路径。默认情况下current_path()用于此参数。

Boost 1.60 引入了一些新功能,其中boost::filesystem::weakly_canonical()1.66文档,当前版本的文档)。此函数缺少第二个参数。标准化 (C++17) 变体std::filesystem::canonical()std::filesystem::weakly_canonical()(参见cppreference)也是如此。

我想与 交换canonical()weakly_canonical()但我使用了第二个参数。这就是我意识到这个论点被删除的方式。现在我想知道为什么它被删除了,以及我怎样才能让路径成为绝对自己。

我发现了一份缺陷报告,暗示了 C++17 的这个解决方案,但坦率地说,我并没有真正理解其中的原因。我会很高兴有一个解释或者更好的例子,其中 base 的重载会被过度指定。

当然,我想知道如何使用不是当前目录的基本目录将相对路径转换为绝对路径。我是否应该简单地使用cppreferencebase / p上的提示,因为我知道这是我的目标系统(带有 Visual C++ 的 Windows)上的正确形式?std::filesystem::absolute()

0 投票
1 回答
1886 浏览

c++ - How should I make std::filesystem appear standards-conforming to Visual Studio 2015

I have a project that is currently locked into Visual Studio 2015. However, I want to write code that is as standards-conforming as possible.

I want to use std::filesystem but it didn't make it into the standard until C++-17. Fortunately, just about everything is available, just in the std::experimental::filesystem::v1 namespace. I'm not a fan of blanket using directives; I prefer to scope things fully to make it clear where the thing comes from. So I'm not going to just put in a global using statement. Some magic is required to convince the compiler to do what I want.

This was my first attempt:

That works pretty well, and std::filesystem::path is now accessible. I've tested creating and using path objects and it works.

As I move forward, I know I'm going to need more stuff. I wondered if there might be a way to just bring in the whole thing:

That seemed like a step backwards. Nothing appears to be visible. In hindsight, I guess it makes sense, since the scope of the using statement ends with the closing brace on the next line.

Next, I want to get a directory_entry. The same technique seems to work

Again, the compiler seems happy.

Now, I want to use std::directory::create_directories. However, this is a function, not a class, so the same technique won't work.

I thought that std::function might be tailor made for this, but I'm not having any luck. I tried

and the compiler says

There are two overloads of the function (one takes a second argument to return an error code rather than throwing an exception).

I'm stuck. This has to be possible but my C++-foo is weak.