[英]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
的任務,因此您無需先調用absolute
或make_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.