2012-09-28 72 views
24

我的當前工作目錄位於/home/myuser/program,我創建了一個指向它的boost::filesystem::path對象。我追加了/../somedir,所以變成了/home/myuser/program/../somedir。但我需要得到它的解決絕對路徑,這將是/home/myuser/somedir使用boost :: filesystem :: path獲取絕對路徑

我一直在嘗試很長時間,我沒有找到任何方法在their reference這樣做。有一種方法叫做make_absolute,它似乎應該做我期望的,但我必須給它一個「根」的路徑參數。它應該是什麼?我真的需要這樣做才能獲得真正的絕對路徑嗎?有沒有其他方法?

回答

21

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

+0

Exatcly。我不想使用「canonical」這個詞,因爲我不確定它是否也意味着解析符號鏈接等。我嘗試了你的建議,並立即生效。謝謝。 – Mario

+3

請注意,如果文件不存在,則canonical會拋出異常。所以你可以只構建現有的路徑。 –

1

的是,make_absolute可選秒參數documentation shows默認爲當前的路徑:

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

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

+0

這是我在文檔中引起一些不滿的一個不一致之處。有一個'make_absolute'方法有一個參數,當我跟隨鏈接時,它會指向我接受兩個參數的'absolute()'函數的文檔。儘管如此,像絕對路徑(pathObject).string()一樣會返回相同的未解析路徑。這是你的建議,對吧? – Mario

0

我必須給它一個「根」路徑參數。

Check the docs:你不給它任何東西;它有一個默認的第二個參數。即,當前目錄。

相對路徑相對於某個目錄。因此,在確定絕對路徑時,您需要知道相對於它應該是絕對的。這就是「根路徑」:它與之相關的目錄。

9

更新,因爲這似乎仍然是谷歌的關於絕對路徑最高命中:

作爲升壓1.57,一些先前建議的功能,至今已刪除。

爲我工作溶液

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

(使用獨立的方法canonical(),在升壓/文件系統/ operations.hpp定義,其經由升壓/ filesystem.hpp自動包含)

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

+0

什麼是「previousPath」和「relativeTo」的示例路徑字符串?我無法弄清楚輸入需要在路徑風格方面的樣子。 –

+0

上一個路徑可能類似於path(「../../ readme.txt」),用relativeTo = path(「c:/ example/test/blah」),然後這應該解析爲「c:/ example/readme」。文本」。如果之前的路徑已經是絕對的,不確定relativeTo的作用(或者甚至需要一個明智的輸入)。 – Daniel

相關問題