2013-04-24 143 views
4

我正在嘗試使用boost創建相對路徑。使用boost創建相對路徑

我最初的計劃是:

string base_directory; // input 
boost::filesystem::path base_path; 
string other_directory; // input 
boost::filesystem::path other_path; 
// assume base_path is absolute - did that already (using complete() 
// if path is relative, to root it in the current directory) -> 
base_directory = base_path.string(); 

if (other_path.empty()) 
    other_directory = base_directory; 
else 
{ 
    other_path = boost::filesystem::path(other_directory);   
    if(!other_path.is_complete()) 
    { 
    other_path = base_path/other_path; 
    other_directory = other_path.string();   
    } 
    if(!boost::filesystem::exists(boost::filesystem::path(other_path))) 
    { 
    boost::filesystem::create_directory(other_path); 
    } 
} 

這工作得很好,如果other_directory是絕對的,或只是一個名稱(或相對內到base_directory)。

但是,如果我試圖把「..」或「../other」放在奇怪的結構中,比如「c:\ test ..」或「c:\ test .. \ other」

如何正確創建相對路徑,最好使用boost?我試圖查看文檔...沒有積極的成功。

我使用Windows(我的提振偏好是,這應該是多平臺的,我已經依賴於它)

編輯:我有提高1.47

謝謝你的任何建議。

回答

1

Boost文件系統不知道"C:\test"是否引用文件或目錄,因此它不會假設尾隨"\"是正確的。

如果添加"\",您可以使用函數boost::filesystem::canonical()簡化路徑刪除...元素。

other_path = boost::filesystem::path(other_directory + "\");         
if(!other_path.is_complete()) 
{ 
    other_path = boost::filesystem::canonical(base_path/other_path); 
+0

謝謝,但它似乎不可用。我提高了1.47(沒有想到它有什麼區別)在您的建議提示下,我查看並發現文檔中的「正常化」,但它並未顯示在boost :: filesystem(或filesystem3)列表中 – Thalia 2013-04-24 22:20:04

+0

如果存在是沒有選擇「封鎖」它,我會接受這一點,我不知道這確實是一個有效的路徑 - 只有在這個答案後,我有勇氣去測試它。 – Thalia 2013-04-24 22:26:53

+0

@Thalia你太親近了!我做了一些小小的研究,並在[boost 1.48](http://www.boost.org/doc/libs/1_48_0/libs/filesystem/v3/doc/reference.html#canonical)中添加了該函數。 :( – 2013-04-24 23:06:03