- mongodb - 在 MongoDB mapreduce 中,如何展平值对象?
- javascript - 对象传播与 Object.assign
- html - 输入类型 ="submit"Vs 按钮标签它们可以互换吗?
- sql - 使用 MongoDB 而不是 MS SQL Server 的优缺点
从 #include <experimental/filesystem>
升级时遇到问题至#include <filesystem>
.似乎 std::filesystem::path::wstring
方法返回的字符串与 experimental::filesystem
中的字符串不同.我编写了以下包含输出结果的小测试程序。
#include <iostream>
#include <filesystem>
#include <experimental/filesystem>
namespace fs = std::filesystem;
namespace ex = std::experimental::filesystem;
using namespace std;
int main()
{
fs::path p1{ L"C:\\temp/foo" };
wcout << "std::filesystem Native: " << p1.wstring() << " Generic: " << p1.generic_wstring() << endl;
ex::path p2{ L"C:\\temp/foo" };
wcout << "std::experimental::filesystem Native: " << p2.wstring() << " Generic: " << p2.generic_wstring() << endl;
}
/* Output:
std::filesystem Native: C:\temp/foo Generic: C:/temp/foo
std::experimental::filesystem Native: C:\temp\foo Generic: C:/temp/foo
*/
根据https://en.cppreference.com/w/cpp/filesystem/path/string :
Return value
The internal pathname in native pathname format, converted to specified string type.
该程序在 Windows 10 上运行,并使用 Visual Studio 2017 版本 15.8.0 编译。我希望 native 路径名是 C:\temp\foo
.
问题:这是 std::filesystem::path
中的错误吗? ?
最佳答案
大致而言,当编译器出现标准禁止的行为(显式或隐式)或与所述编译器的文档不同的行为时,就会发生错误。
该标准对本地路径字符串的格式没有任何限制,只是底层操作系统应该接受该格式(以下引用)。它怎么能施加这样的限制?该语言对主机操作系统如何处理路径没有发言权,并且要自信地做到这一点,它必须知道它可能编译到的每一个目标,这显然是不可行的。
[fs.class.path]
5 A pathname is a character string that represents the name of a path. Pathnames are formatted according to the generic pathname format grammar ([fs.path.generic]) or according to an operating system dependent native pathname format accepted by the host operating system.
(强调我的)
The documentation of MSVC暗示正斜杠完全可以用作分隔符:
Common to both systems is the structure imposed on a pathname once you get past the root name. For the pathname c:/abc/xyz/def.ext:
- The root name is
c:
.- The root directory is
/
.- The root path is
c:/
.- The relative path is
abc/xyz/def.ext
.- The parent path is
c:/abc/xyz
.- The filename is
def.ext
.- The stem is
def
.- The extension is
.ext
.
它确实提到了首选分隔符,但这实际上仅暗示 std::make_preferred
的行为,而不是默认路径输出的行为:
A minor difference is the preferred separator, between the sequence of directories in a pathname. Both operating systems let you write a forward slash
/
, but in some contexts Windows prefers a backslash\
.
因此,这是否是错误的问题很简单:由于标准对行为没有施加任何限制,并且编译器的文档暗示没有强制需要反斜杠,因此不可能有错误。
剩下的问题是这是否是一个实现质量问题。毕竟,编译器和库的实现者应该知道他们的目标的所有怪癖,并相应地实现特性。
您应该在 Windows 中使用哪个斜杠('\'
或 '/'
),或者它是否真的很重要,有待商榷,所以可以没有权威的答案。任何主张其中一个或另一个的答案都必须非常小心,不要过于基于意见。此外,path::make_preferred
的存在表明 native 路径不一定是首选路径。考虑零开销原则:让路径始终是首选路径会给那些在处理路径时不需要那么迂腐的人带来开销。
最后,std::experimental
命名空间就是它在包装盒上所说的:你不应该期望最终标准化库的行为与其实验版本相同,或者甚至期望最终标准化图书馆将完全存在。处理实验性的东西时就是这样。
关于c++ - C++17 std::filesystem::path 中的 native 路径分隔符错误?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51886072/
这是我的作业 What does echo PATH $PATH \$PATH do? 我不知道它是如何工作的。 echo PATH打印“路径” $PATH创建一个“PATH”变量......也许?
我想弄清楚两者之间的区别 路径=路径+[节点1] 路径+=[节点1] path.append(node1) 我得到的是 path = path + [node1] 的正确路径,但不是其他两个。 def
我使用 Robot 框架在 Ride 中创建了一个测试用例。运行时出现错误。 我更新了python的路径。我更新了库和 Ride。我换了文件夹还是不行 *** Settings *** Documen
我尝试使用额外的功能自定义 pathlib.Path()。特别是,我真的很喜欢使用上下文管理器作为移入和移出目录的方法。我一直在使用它,但我似乎在让 Path() 与自定义上下文管理器一起工作时遇到错
编辑:基于 Ulf Rompe 的评论,重要的是使用“1”而不是“0”,否则您将破坏 sys.path . 我已经做 python 很长一段时间了(一年多),我总是很困惑为什么人们建议你使用 sys.
我有兴趣这样做的原因是因为我的路径中有一部分将保持不变,但我希望将其与其所有父部分一起删除。 所以如果我们说, some/unknown/path/foo/bar/baz 我想回去 bar/baz 但
在几个 SO 的问题中,有这些行可以访问代码的父目录,例如os.path.join(os.path.dirname(__file__)) returns nothing和 os.path.join(o
我已经在我的 Linux 中安装了 anaconda 来导入 python 包。 安装 anaconda 后,我无法在 python 中使用 anaconda,经过一番搜索后我发现输入此命令我能够使用
哪个更好用,为什么?我的意思是这两个命令在哪些方面不同以及如何不同?性能、可读性…… new FileInfo(path).Name 或 Path.GetFileName(path) 最佳答案 因为您
这不适用于某些设备。 在三星设备中,他们不允许使用下载管理器下载文件。 我已经在 list 中定义了权限并获得了运行时权限。 DownloadManager downloadManager = (Do
我想知道在这个例子中使用 Paths.get() 和 Path.resolve 有什么区别: public static void main(String[] args) { Path p1
目前我正在开发一个转换由 Inkscape 创建的 svg-paths 的应用程序。现在我不清楚关于绝对和相对路径组合的路径规范。规范是否说明了同时包含相对和绝对坐标的路径定义? 特别是关于绝对贝塞尔
我正在编写脚本,我需要在用户的 $PATH 上查找命令并获取该命令的完整路径。问题是我不知道用户的登录 shell 是什么,或者他们的 do 文件中可能有什么奇怪的东西。我将 bourne shell
Metalsmith 的文档对 path() 函数没有太多解释:#path(paths...): Resolve any amount of paths... relative to the work
我知道我可以通过 regedit 更改我的 wine PATH,但实际上我只需要为一次运行更改 PATH。 例如,我的软件名为frontend.exe,这取决于example/mylib.dll,我需
因此,绝对路径是一种到达某个文件或位置的方法,描述了它的完整路径、完整路径,并且它依赖于操作系统(Windows 和 Linux 的绝对路径,例如,不同)。另一方面,相对路径是从当前位置 ..(两个点
我对编程有点陌生(不是真的,但我仍在学习 - 我们不是吗?)。虽然我了解 Java 和 Python,并且了解 C、C++、JS、C#、HTML、CSS 等(并且我可以在终端中很好地导航),但我不熟悉
我对编程有点陌生(不是真的,但我仍在学习 - 我们不是吗?)。虽然我了解 Java 和 Python,并且了解 C、C++、JS、C#、HTML、CSS 等(并且我可以在终端中很好地导航),但我不熟悉
这个问题不太可能对任何 future 的访客有帮助;它只与一个较小的地理区域、一个特定的时间点或一个非常狭窄的情况相关,通常不适用于全世界的互联网受众。如需帮助使此问题更广泛适用,visit the
使用环境变量(如 PATH)作为 $PATH 或 ${PATH} 有什么区别? 最佳答案 在大多数情况下没有区别。唯一重要的是你是否想在扩展后包含尾随文本。例如,假设您的 PATH 包含字符串 FOO
我是一名优秀的程序员,十分优秀!