转换为const char*后,boost文件系统规范路径无效。

4

我正在尝试将相对路径转换为绝对路径,然后使用boost文件系统将其传递给SQLite。这应该可以在Windows和Linux下正常工作。

    boost::filesystem::path path("../../data/dominion");
    boost::filesystem::path file("dominion.db");
    boost::filesystem::path canonical = boost::filesystem::canonical(dataPath / file);

规范返回

   m_pathname=L"D:/Users\\me\\Documents\\tonkatsu\\data\\dominion\\dominion.db" 

正如您所看到的,路径“D:/”的开头不正确。我也尝试过将normalize()调用它,但没有成功。

有什么办法可以解决这个问题吗?


1
虽然这不是标准做法,但在Windows的许多部件/库中也可以使用正斜杠。你已经尝试过实际传递该路径了吗? - outlyer
1
将该路径传递给sqlite3_open返回了一个错误,但是您是正确的,如果我在资源管理器中使用该路径,该路径是正确的。 - kittikun
1个回答

6

尽管这并非标准惯例,但在Windows上也可以使用正斜杠,这就是为什么boost不强制进行转换的原因。

然而,一些库不接受正斜杠。boost::filesystem::path::make_preferred()[1] 旨在解决这种情况,通过将路径转换为系统的“首选”表示(即在Windows上使用反斜杠)。

[1] 这个较旧的参考文献使得这种行为更加明显

如下所讨论的,尽管(大多数)Windows API 接受正斜杠,甚至允许正斜杠和反斜杠混合使用,但包括Windows中的应用程序在内的一些用户界面却不允许。


反斜杠在Windows上是不被接受的,你为什么认为会被接受呢?试着打开记事本并尝试使用反斜杠打开文件路径。似乎只有运行框能够处理反斜杠,而Windows本身不能。另一个问题是:boost::canonical实际上将正常路径转换为无效路径。如果我传递给它有效的Windows路径,POS会将第一个斜杠转换为反斜杠。为什么会这样呢? - Pavel P
基本上,正斜杠并不是普遍支持的,这使得带有正斜杠的路径无效。 - Pavel P
1
@pavel的经验让我这么想。记事本不是Windows;Windows API确实接受正斜杠,一些应用程序和库不允许使用它们的事实不应该欺骗你。请参见https://msdn.microsoft.com/en-us/library/aa365247(VS.85).aspx。正如上面所提到的,Boost确实提供了一种强制使用反斜杠的方法。 - outlyer
是的,你说得对,我尝试调用了winapi,它确实可以工作,并且make_preferred会修复驱动器字母中第一个正斜杠后弄乱的路径。到目前为止,我最大的烦恼是文件打开对话框(也是winapi)似乎不喜欢路径中的正斜杠。 - Pavel P

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接