【发布时间】:2019-02-02 16:10:27
【问题描述】:
我感觉 C++ 文件系统标准在 Windows 上被破坏了。它在很大程度上基于 Boost.filesystem,我刚刚发现了一个严重的问题,它(可能)也存在于 std::filesystem 中:https://github.com/boostorg/filesystem/issues/99
本质是“root_name”和“root_directory”的定义:
root-name(可选):标识具有多个根的文件系统上的根(例如“C:”或“//myserver”)。在有歧义的情况下,形成有效根名称的最长字符序列被视为根名称。除了 OS API 可以理解的根名称之外,标准库还可以定义其他根名称。
root-directory(可选):目录分隔符,如果存在,则将此路径标记为绝对路径。如果它丢失(并且除根名称之外的第一个元素是文件名),则路径是相对的,并且需要另一个路径作为起始位置才能解析为文件名。
这需要例如"C:\foo\bar.txt" 被分解成:
- root_name: "C:"
- root_directory:“\”或“/”(这有意义吗?)
- 目录:“foo”
- 文件名“bar.txt”
现在的问题:这条路径的第一部分不是路径,至少不是原来的路径。这来自windows上的解释:
- “C:\”是驱动器“C”
- “C:”是驱动器“C”上的当前工作目录
Minor:“\foo\bar.txt”应该如何在windows上按照上面的解释?你有一个“root_directory”(奇怪的是它不是一个目录,而是一个目录分隔符)但没有“root_name”,因此路径不能是绝对的,所以你也没有“root_directory”。叹息。
因此,我觉得“root_name”和“root_directory”不能分解(在Windows上)。在“C:\foo”中,您将拥有“C:\”,在“C:foo”中,您将拥有“C:”。或者要保留(奇怪定义的)“root_directory”,您需要将分解“C:\ foo”设置为“C:\”,“\”和“foo”并与后者斗争:这是绝对路径吗?其实就是:“C盘当前工作目录下的文件夹‘foo’”,很绝对吧?
但是你可以说“absolute==independent of current working dir”,那么“root_directory”是有意义的:“C:\foo”是“\”,“C:foo”是空的。
所以问题:在像“C:\foo”这样的路径中将“C:”定义为“root_name”而不是“C:\”是标准错误,还是迭代路径的组件只是无效的用法期望前缀总和是“有效的”?
【问题讨论】:
标签: c++ winapi c++17 boost-filesystem