std :: filesystem :: path的奇怪运算符/

问题描述

auto path = std::filesystem::path("c:") / "PosteClient.log";

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

这对我来说是个奇怪的行为,例如Windows上的结果无法使用

CreateFile("c:PosteClient.log")

失败,并显示ERROR_FILE_NOT_FOUND。

我无法在文档中找到此行为的原因,但是从示例中可以看出,这是预期的行为。 https://en.cppreference.com/w/cpp/filesystem/path/append

我想了解为什么这种行为会为我的代码找到合适的解决方案,该解决方案适用于使用此运算符的所有情况

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

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,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:\ SRC \ ConsoleApplication3 \

当我现在通过以下方式致电此代码

CreateHandleFromPath(std::filesystem::path("c:\\"),"test.log")

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

CreateHandleFromPath(std::filesystem::path("c:"),"test.log")

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

我无法控制来电者。 当然可以很容易地在此处进行检查并手动添加分隔符,但这意味着我可以一直自己做,并且不需要操作员,甚至更精确地说,由我自己添加分隔符更加安全这将在所有情况下均适用,操作员/适用于所有人,除非有人用带反斜杠的驱动器号进行呼叫。我只想了解功能为何如此运作,因为我认为背后有一个原因导致我目前看不到

解决方法

暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!

如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。

小编邮箱:dio#foxmail.com (将#修改为@)