我正在尝试将文件的修改时间格式化为字符串 (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) std::filesystem::path似乎不知道Windows 长路径 magic prefix。这是每个设计还是有可以使用的模式/标志/编译器开关/第三方库?
铁
C:\temp\test.txt,root_nameisC:和root_pathisC:\都是有效路径,但是\\?\C:\tmp\test.txt他们是\\?并且\\?\我希望它们是C:,C:\因为\\?\它不是路径,而只是一个用于解决旧版 Windows 260 字符路径限制的标签。
我有一个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功能以某种方式模仿它?
传统的 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 中的错误还是故意行为?这种行为的原因是否记录在某处?
考虑这个最小的例子:
#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++ 错误? …
使用 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 版本上运行?
我似乎找不到可能传递到 的ec参数中的错误代码列表std::filesystem::copy。
cppreference.com 似乎表明错误代码是特定于操作系统的。
查看Microsoft 文档(因为我对 Windows 错误代码特别感兴趣,尽管我确信其他操作系统的资源对其他人会有帮助),它看起来几乎像是相同源文档的复制/粘贴,没有任何附加信息任何 Windows 特定的内容。
我的猜测是,错误代码将与此处列出的错误代码相同,但是没有关于哪些错误代码与文件系统相关的信息,或者更具体地说与函数相关的信息copy()(超出了有根据的猜测)。
有谁有关于可能返回的潜在错误代码的任何资源,或者,如果我必须以困难的方式执行此操作(并手动尝试并检查不同的错误情况),我如何知道我是否有详尽的列表?
我正在尝试获取最后一个文件名。下面的代码非常优雅。但它正在遍历目录中的所有文件。 是否可以在不迭代的情况下获取最后一个文件?
#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)
已编辑:目录中的文件已按字母顺序递增。我想选择最新的文件,它已经确定是按字母顺序排列的最后一个文件。由于可能有数百万个文件,我试图避免迭代。
我想用来std::filesystem查询提供给我的函数的磁盘文件夹路径。我想知道我是否有该文件夹的写入权限。但我想在不实际尝试写入文件夹的情况下执行此操作。
最后一个要求部分是因为
看来这std::filesystem::status()就是我想要的功能。然而,该函数返回的权限标志包括owner_write、group_write和others_write。
我如何知道其中哪一个适用于我?我不知道我的应用程序/用户是所有者、组还是“其他”。can_i_write_to_this_folder()某处是否有某种功能正在运行?
我能找到的唯一与此相关的线程没有涉及的答案<filesystem>
[编辑] 人们似乎认为我正在寻找一些不切实际的可写性保证。我不是。我并不认为任何文件系统功能都是万无一失的。我不会将某些关键任务系统建立在这个决定的基础上
当<filesystem>他们过来给我们所有的东西directory_iterator和其他好东西时,他们所宣传的目的是有用的。所以当我发现这是真的时,我评估了它们并使用了它们。就像我对std::atomic<>参数包和std::variant许多其他东西所做的那样。我想我们都同意,多年来添加了一些东西,但事实证明并不是那么好。
现在,该库宣传了此功能,filesystem::status()旨在告诉我们(除其他外)文件或文件夹的权限。我想知道这个“访问”信息是否有任何实际用途。
共识似乎是事实并非如此。
我的程序应该创建两个具有用户指定路径的文件。我需要知道路径是否通向同一位置,以便在开始更改文件系统之前以错误结束。
由于路径来自用户,因此它们应该是非规范且奇怪的。例如,它们可能是./dir1/subdir/file,并且符号链接dir2/subdir/../subdir/file在哪里并且还不存在。预期的结果仍然是,它们是等价的。dir2dir1subdirtrue
std::filesystem::equivalent仅适用于已存在的文件。有没有类似的功能,没有这个限制?
std-filesystem ×10
c++ ×9
c++17 ×6
clang ×1
error-code ×1
gcc9 ×1
libstdc++ ×1
long-path ×1
macos-mojave ×1
std ×1
windows ×1
xcode ×1