簡體   English   中英

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

[英]Strange operator/ of 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,
        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:\SRC\ConsoleApplication3\

當我現在調用此代碼時

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

function 成功,因為結果路徑是“c:\test.log”

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

function 失敗,因為結果路徑是“c:test.log”

我無法控制來電者。 當然,在這里進行檢查並手動添加分隔符很容易,但這意味着我可以一直自己做,不需要操作員,或者更准確地說,我自己添加更安全,因為這將適用於所有情況,運算符/適用於所有人,除非有人使用沒有反斜杠的驅動器號調用。 我只想了解為什么 function 會這樣工作,因為我認為有一個我目前看不到的原因

這是因為C:PosteClient.log實際上是一個有效路徑,並且很可能與C:\PosteClient.log不同。

關鍵是 Windows 進程維護每個驅動器的工作目錄。

比方說:

  • C:\THING\PosteClient.logD:存在
  • cd C:\THING
  • D:

現在, type C:PosteClient.log可以正確找到您的文件,而C:\PosteClient.log不能(也不應該)。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM