2011-12-05 71 views
14

有沒有辦法使用Boost.Filesystem來獲取平臺的路徑分隔符?通過路徑分隔符,我的意思是Unix的/和Windows的\使用Boost.Filesystem獲取平臺的路徑分隔符

我已經知道我可以使用boost::filesystem::path::operator/將兩條路徑連同適當的分隔符連接在一起。但我只想要/\

我也知道我可以使用#ifdef _WIN32,但我更喜歡Boost.Filesystem告訴我適當的分隔符。

編輯: 我想使用Boost.Filesystem API的version 3,如Boost 1.48中所使用的。

+0

D'哦!我正在尋找一個API,直接給我的路徑分隔符,並沒有想到簡單地使用:'boost :: filesystem :: path(「/」)。native()' –

+0

有人可以確認'boost: :文件系統::路徑(「/」)。native()'返回'「\\」'在Windows上? –

+3

就這麼你知道,Windows接受'/'作爲pafh分隔符。 – Xeo

回答

8

作爲1.57版本,現在升壓具有更好的解決方案,這僅僅是恆定char/wchar_t(依賴於不同平臺):boost::filesystem::path::preferred_separator

閱讀http://www.boost.org/doc/libs/release/libs/filesystem/doc/reference.html#Operating-system-examples瞭解更多信息。它裏面還有更多與系統相關的功能。

簡單的例子:

#include <boost/filesystem.hpp> 
#include <iostream> 

int main() { 
    std::cout << boost::filesystem::path::preferred_separator << std::endl; 
} 
+0

快速瀏覽boost源代碼,發現boost只是在預處理器階段使用ifdef來獲取分隔符。 在這種情況下,不需要使用boost,但是,如果它們位於* nix框中的非標準文件系統上,那麼boost將不合理地假設爲/。 – tom

+0

這不會給VS2015上的正確分隔符。 –

1

沒有測試過這一點,但它看起來像你應該能夠使用在最近的一個升壓:

http://www.boost.org/doc/libs/1_43_0/libs/filesystem/doc/reference.html

#include <boost/filesystem.hpp> 
#include <iostream> 

int main() { 
    std::cout << boost::filesystem::slash<boost::filesystem::path>::value << std::endl; 
} 
+1

不幸的是,'slash'似乎不再是API的一部分。 –

11

好像boost::filesystem::path::make_preferred是門票:

影響:包含的路徑名將被轉換爲首選的本地格式 格式。 [注意:在Windows上,效果是用 反斜槓替換斜線。在POSIX上,沒有任何效果。 - 注完]

實施例:

namespace bfs = boost::filesystem; 
bfs::path slash("/"); 
bfs::path::string_type preferredSlash = slash.make_preferred().native(); 
+0

新的URL http://www.boost.org/doc/libs/release/libs/filesystem/doc/reference.html#path-make_preferred – KindDragon

+0

@KindDragon:Thanks –

+0

在windows上,這將無法編譯,因爲native()將返回std :: wstring。儘管如此,這與這個問題的目的無關。 – AI0867