[英]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.log
和D:
存在cd C:\THING
D:
現在, type C:PosteClient.log
可以正確找到您的文件,而C:\PosteClient.log
不能(也不應該)。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.