2010-06-02 50 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之外使用。