对于符号链接,Boost :: filesystem :: is_empty()返回false

时间:2014-03-26 17:13:42

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

直到一周前,我一直在我的项目中使用Boost 1.46.1。将所有内容升级到Boost 1.55.0之后,我注意到某些功能与以前不同。

我的软件加载通过SymLinks放置的配置文件。我正在使用微软mklink来做这件事。

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

  • 有没有办法以Boost能够识别它们的方式创建链接?
  • 如果我可以访问代码:我怎样才能将其更改为再次使用?

更新

回应评论的更多信息:

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

UPDATE2:

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

1 个答案:

答案 0 :(得分:1)

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

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

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

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

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