C++ std::filesystem::path的奇怪运算符

C++ std::filesystem::path的奇怪运算符,c++,windows,stl,std-filesystem,C++,Windows,Stl,Std Filesystem,结果是c:PosteClient.log而不是c:\PosteClient.log 这对我来说是一种奇怪的行为,因为windows上的结果无法使用 CreateFile(“c:postclient.log”) 失败,错误为未找到文件 我在docu中找不到这种行为的原因,但从示例来看,这似乎是预期的行为 我想了解为什么行为是这样的,以便为我的代码找到一个合适的解决方案,它适用于使用此运算符的所有场景 更准确地说,假设我有以下代码: auto path = std::filesystem::path

结果是c:PosteClient.log而不是c:\PosteClient.log

这对我来说是一种奇怪的行为,因为windows上的结果无法使用

CreateFile(“c:postclient.log”)

失败,错误为未找到文件

我在docu中找不到这种行为的原因,但从示例来看,这似乎是预期的行为

我想了解为什么行为是这样的,以便为我的代码找到一个合适的解决方案,它适用于使用此运算符的所有场景

更准确地说,假设我有以下代码:

auto path = std::filesystem::path("c:") / "PosteClient.log";
工作目录是

C:\SRC\ConsoleApplication3\

当我现在用

HANDLE CreateHandleFromPath(const std::filesystem::path& path, const std::string& fileName)
{
    auto pathComplete = path / fileName;

    auto* hFile = CreateFileW(
        pathComplete.wstring().c_str(),
        GENERIC_READ,
        FILE_SHARE_READ, nullptr, OPEN_EXISTING,
        0,
        nullptr);

    if (hFile == INVALID_HANDLE_VALUE || hFile == nullptr)
    {
        throw std::filesystem::filesystem_error(
            "Can't get handle",
            std::error_code(::GetLastError(), std::system_category()));
    }

    return hFile;
}
函数成功,因为结果路径为“c:\test.log”

函数失败,因为结果路径为“c:test.log”

我无法控制打电话的人。
当然,在这里进行检查和手动添加分离器很容易,但这意味着我可以一直自己做,不需要操作员,或者更准确地说,自己添加更安全,因为这在所有情况下都可以工作,除了有人用没有反斜杠的驱动器号打电话外,操作员/对所有人都有效。我只想了解为什么函数会这样工作,因为我认为这背后有一个我目前看不到的原因

我认为这种行为仅限于Windows上的驱动器号。但正如您所知,您可以手动添加文件分隔符:
std::filesystem::path::preferred_separator
这是
operator/
operator=
,而不是
operator/=
如果使用相对路径
std::filesystem::path(“c:”
与绝对路径
std::filesystem::path(“c:/”)相比,这有什么关系吗
?“C:”是驱动器相对路径。它解析为驱动器上的工作目录。加入“postclient.log”将产生“C:postclient.log”。如果驱动器上的工作目录为“C:\Spam”,则解析路径将为“C:\Spam\PosteClient.log”。如果驱动器“C:”不是进程工作目录的驱动器,则系统从名为“=C:”的隐藏环境变量中获取每个驱动器的工作目录。如果未定义该变量,或引用驱动器上不存在的路径,则系统将使用驱动器上的根目录。我认为该行为仅限于Windows上的驱动器号。但正如您所知,您可以手动添加文件分隔符:
std::filesystem::path::preferred_separator
这是
operator/
operator=
,而不是
operator/=
如果使用相对路径
std::filesystem::path(“c:”
与绝对路径
std::filesystem::path(“c:/”)相比,这有什么关系吗
?“C:”是驱动器相对路径。它解析为驱动器上的工作目录。加入“postclient.log”将产生“C:postclient.log”。如果驱动器上的工作目录为“C:\Spam”,则解析路径将为“C:\Spam\PosteClient.log”。如果驱动器“C:”不是进程工作目录的驱动器,则系统从名为“=C:”的隐藏环境变量中获取每个驱动器的工作目录。如果未定义该变量,或引用驱动器上不存在的路径,则系统将使用驱动器上的根目录。
CreateHandleFromPath(std::filesystem::path("c:\\"), "test.log")
CreateHandleFromPath(std::filesystem::path("c:"), "test.log")