簡體   English   中英

使用 boost::filesystem::path 獲取絕對路徑

[英]Get absolute path with boost::filesystem::path

我當前的工作目錄位於/home/myuser/program ,我創建了一個指向它的boost::filesystem::path對象。 我附加了/../somedir所以它變成了/home/myuser/program/../somedir 但我需要獲取其解析的絕對路徑,即/home/myuser/somedir

我已經嘗試了很長時間,但在他們的參考資料中我沒有找到任何方法來做到這一點。 有一個叫做make_absolute的方法,它似乎應該按照我的預期做,但我必須給它一個“根”路徑參數。 應該是哪個? 我真的需要這樣做才能獲得真正的絕對路徑嗎? 有沒有其他辦法?

你說你想要一個絕對路徑,但你的例子表明你已經有了一個絕對路徑。 刪除路徑的..組件的過程稱為規范化 為此,您應該調用canonical 它恰好也執行absolute的任務,因此您無需先調用absolutemake_absolute make_absolute函數需要一個基本路徑; 如果你沒有更好的東西,你可以通過它current_path()

更新,因為這似乎仍然是谷歌關於絕對路徑的熱門話題:

從 Boost 1.57 開始,一些先前建議的功能已被刪除。

對我有用的解決方案是

boost::filesystem::path canonicalPath = boost::filesystem::canonical(previousPath, relativeTo);

(使用在 boost/filesystem/operations.hpp 中定義的獨立方法canonical() ,它通過 boost/filesystem.hpp 自動包含)

重要提示:在不存在的路徑上調用規范(例如,您要創建文件)將引發異常。 在這種情況下,您的下一個最佳選擇可能是 boost::filesystem::absolute()。 它也適用於不存在的路徑,但不會去掉路徑中間的點(如 a/b/c/../../d.txt)。 注意:確保relativeTo 引用一個目錄,在引用文件的路徑上調用parent_path()(例如,包含目錄的打開文件或相對於自身的文件路徑)。

文檔顯示make_absolute有一個可選的第二個參數,默認為您的當前路徑:

path absolute(const path& p, const path& base=current_path());

在沒有第二個參數的情況下嘗試它,看看它是否返回您正在尋找的結果。

我必須給它一個“根”路徑參數。

檢查文檔:沒有給它任何東西; 它有一個默認的第二個參數。 即當前目錄。

相對路徑是相對於某個目錄的。 因此,在使路徑成為絕對路徑時,您需要知道它相對於. 那是“根路徑”:它相對的目錄。

// input: d:\\tmp\\\\a/../VsDebugConsole.png
// output: d:\\tmp\\VsDebugConsole.png
static std::wstring fix_path(std::wstring path)
{
    //boost::replace_all(path, L"\\\\", L"\\");
    //boost::replace_all(path, L"//", L"/");
    boost::filesystem::path bpath(path);
    bpath = boost::filesystem::system_complete(bpath);

    return bpath.wstring();
}

暫無
暫無

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

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