【问题标题】:boost filesystem canonical path is not valid after conversion to const char *boost 文件系统规范路径在转换为 const char 后无效 *
【发布时间】:2014-11-24 17:46:12
【问题描述】:

我正在尝试转换相对路径并将其转换为绝对路径以使用 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() 没有成功

有没有办法解决这个问题?

【问题讨论】:

  • 尽管不是标准做法,但正斜杠也可以在 Windows 上的许多部件/库中使用。您是否尝试过实际通过那条路径?
  • 将该路径传递给 sqlite3_open 返回错误,但您是正确的,如果我在资源管理器中使用该路径,则该路径是正确的

标签: c++ boost-filesystem


【解决方案1】:

尽管不是标准做法,但在 Windows 上也接受正斜杠,这就是 boost 不强制转换的原因。

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

[1]This older reference makes that behaviour more obvious

如下所述,虽然(大部分)Windows API 接受正斜杠,甚至是正斜杠和反斜杠的混合,但某些用户界面甚至在 Windows 中包含的应用程序上也不接受。

【讨论】:

  • Windows 不接受正斜杠,你为什么这么认为?尝试打开记事本并尝试使用正斜杠打开文件路径。似乎已修复运行框以处理正斜杠,而 Windows 本身则没有。另一点: boost::canonical 实际上将正常路径破坏为无效路径。如果我将有效的 Windows 路径传递给它,则 POS 将第一个斜杠变为正斜杠。为什么!?
  • 基本上没有普遍支持正向斜杠,这使得这些带有正向斜杠的路径无效
  • @pavel 的经历让我这么想。记事本不是 Windows; Windows API 确实接受正斜杠,一些应用程序和库不允许它们的事实不应该欺骗你。见msdn.microsoft.com/en-us/library/aa365247(VS.85).aspx。如上所述,Boost 确实提供了一种强制反斜杠的方法。
  • 是的,你是对的,我尝试调用 winapi 并且它确实有效,并且 make_preferred 使用驱动器号中的第一个正斜杠修复了混乱的路径。到目前为止,我最大的烦恼是文件打开对话框(也是 winapi)似乎不喜欢路径中的正斜杠
猜你喜欢
  • 2021-02-15
  • 2010-11-17
  • 1970-01-01
  • 1970-01-01
  • 2018-11-16
  • 1970-01-01
  • 1970-01-01
  • 2019-05-07
  • 2017-03-19
相关资源
最近更新 更多