2010-06-02 46 views
2

我正在讀取以Windows格式存儲爲相對路徑的數據庫中的路徑名,並嘗試在Unix系統上從它們創建boost :: filesystem ::路徑。會發生什麼是構造函數調用將整個字符串解釋爲文件名。我需要將路徑轉換爲正確的Posix路徑,因爲它將在本地使用。boost :: filesystem - 如何從posix plattforms上的Windows路徑字符串創建加速路徑?

我沒有在boost :: filesystem參考中找到任何轉換函數,也沒有通過google找到。我只是失明瞭,是否有明顯的解決方案?如果不是,你會如何做到這一點?

例子:

std::string win_path("foo\\bar\\asdf.xml"); 
std::string posix_path("foo/bar/asdf.xml"); 

// loops just once, as part is the whole win_path interpreted as a filename 
boost::filesystem::path boost_path(win_path); 
BOOST_FOREACH(boost::filesystem::path part, boost_path) { 
    std::cout << part << std::endl; 
} 

// prints each path component separately 
boost::filesystem::path boost_path_posix(posix_path); 
BOOST_FOREACH(boost::filesystem::path part, boost_path_posix) { 
    std::cout << part << std::endl; 
} 

編輯:當然我只需更換反斜槓,但有說, 「只是工作(TM)」 適用於Windows和Unix plattforms的解決方案?

回答

3

不幸的是,Windows路徑語法是有條件編譯的,只有在Windows上編譯時才包含。我不明白他們爲什麼這樣做。無論如何,這意味着您始終可以使用至多兩個解析器;便攜式的,和Posix的一樣,還有原生的,這取決於你當前編譯的平臺。

什麼可以「工作」是所有的路徑存儲在便攜式(Posix)格式。你可以在所有平臺上簡單地解析它。

+0

不幸的是,我可能不會更改數據庫中的格式,所以我必須去替換反斜槓...... – VolkA 2010-06-02 13:42:03

2

如何用斜線替換反斜槓?

+0

顯而易見的答案:)有沒有什麼辦法可能會出錯,因爲在路徑字符串內的一些可疑轉義?我希望有一些boost :: filesystem解決方案能夠爲Windows和Linux做正確的事情,而無需在我身邊進一步工作(* lazy *)。 – VolkA 2010-06-02 13:14:10

+0

並非所有的文件系統都支持相同的文件名,所以可能在特殊情況下(或惡意用戶)出現問題。您可以查看數據庫以查看是否有任何問題。 – Amnon 2010-06-02 13:25:39

+0

我發現這個職位幾乎相同的問題,除了我必須處理絕對或相對Windows路徑。 POSIX解析器將正確處理C:/ foo/bar而非C:\ foo \ bar非常奇怪。儘管如此,確實如此,即使是絕對路徑替換斜槓也應該起作用。 – 2011-08-17 16:48:40

1

看看頭文件,我發現如果你定義了BOOST_WINDOWS_PATH(在包含頭文件之前),它會在Windows路徑算法中編譯。我不知道它是否可以在Windows之外使用。