【问题标题】:Boost::filesystem::is_empty() returns false for SymlinksBoost::filesystem::is_empty() 为符号链接返回 false
【发布时间】:2014-03-26 17:13:41
【问题描述】:

直到一周前,我一直在我的项目中使用 Boost 1.46.1。将所有内容升级到 Boost 1.55.0 后,我注意到某些功能无法像以前那样工作。

我的软件加载通过 SymLink 放置的配置文件。我正在使用 Microsoft 的 mklink 来执行此操作。

我今天发现,虽然 1.46.1 版本中的 boost::filesystem::is_empty() 为我的链接返回 false,但它现在在 1.55.0 中返回 true。不幸的是,我无法更改使用该代码的组件。结果是我的配置文件不再加载。

  • 有没有办法以 Boost 能够识别的方式创建链接?
  • 如果我可以访问代码:我需要如何更改它才能再次工作?

更新:

更多回应 cmets 的信息:

  • SymLink 有效,有一个文件链接到它
  • 链接到 SymLink 的文件不是空的,它是之前有效的配置文件
  • 用户拥有 SymLink 和链接文件的权限
  • 我可以对该文件执行fopen 并读取其内容

更新 2:

我刚刚创建了一个 Github 项目,其中包含重新创建问题的所有内容。我使用VS 2013 Express编译程序:

【问题讨论】:

  • 听起来很奇怪。必须做额外的工作来检测符号链接。你能发布示例代码吗?
  • 请详细说明您传递给 Boost 的符号链接的确切状态。链接是否断开(目标不存在)?如果目标存在,它的大小是否为 0(目标为空)?还是符号链接会导致非空文件?还要确保用户对符号链接及其目标都具有权限。
  • 我刚刚确认了与 mingw g++ 4.8.2 一起使用的 boost 5.5.0 报告 is_empty 对于非空文件的链接是正确的。
  • 刚刚添加了更多信息,感谢到目前为止的 cmets
  • 我在 Mac OS 上测试了 Boost 1.55,如果符号链接指向非空文件,它将报告 is_empty() 为 false,如果它指向空文件,则报告为 true。所以它“遵循”符号链接。

标签: c++ windows boost symlink boost-filesystem


【解决方案1】:

问题在于 Windows 上旧版本的 Boost 文件系统 (V2) 使用 VC++ 的 stat() 函数来获取目标文件的信息,并且该函数遵循符号链接。

较新版本的文件系统库 (V3) 使用 Win32 GetFileAttributesExW() API,它不遵循符号链接,因此路径指定的对象的大小返回为 0。

It looks like 文件系统 V3 在 Boost 1.46 中成为默认值,而 V2 在 1.48 中从库中删除。解决您的问题的一种可能方法是回到 1.48 之前的 Boost 版本(并可能使用设置为 2 的 BOOST_FILESYSTEM_VERSION 宏构建库)。

我已针对此问题打开了一个错误,错误报告中包含一个针对 libs/filesystem/src/operations.cpp 的补丁,可修复该问题:

请记住,我在错误报告中提交的补丁没有经过太多测试(例如,它需要针对其他版本的 Windows 进行测试,使用 MinGW 工具链,路径包含 ASCII 范围之外的字符,目录作为目标,可能还有一些我没有想到的其他东西)。但是,如果您想继续使用最近的 Boost 版本,欢迎您修补本地 Boost 库,看看它是否能解决您的问题。

【讨论】:

猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2011-10-21
  • 2013-07-07
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多