直到一周前,我一直在我的项目中使用 Boost 1.46.1。将所有内容升级到 Boost 1.55.0 后,我注意到某些功能无法像以前那样工作。
我的软件加载通过 SymLinks 放置的配置文件。我正在使用 Microsoft mklink做这个。
我今天发现虽然 1.46.1 版中的 boost::filesystem::is_empty()
为我的链接返回 false
,但它现在返回 true
在 1.55.0 中。不幸的是,我无法更改使用该代码的组件。结果是我的配置文件不再加载。
- 有没有办法以 Boost 能够识别的方式创建链接?
- 如果我可以访问代码:我需要如何更改它才能再次运行?
更新:
回复评论的更多信息:
- SymLink 有效,有一个文件链接到它
- 链接到 SymLink 的文件不为空,它是之前有效的有效配置文件
- 用户有权访问 SymLink 和链接的文件
- 我可以对该文件执行
fopen
并读取其内容
更新 2:
我刚刚创建了一个包含所有内容的 Github 项目来重现该问题。我使用 VS 2013 Express 编译程序:
最佳答案
问题是 Windows 上旧版本的 Boost 文件系统 (V2) 使用 VC++ 的 stat()
函数来获取目标文件的信息,并且该函数遵循符号链接(symbolic link)。
较新版本的文件系统库 (V3) 使用 Win32 GetFileAttributesExW()
API,它不遵循符号链接(symbolic link),因此路径指定的对象大小返回为 0 .
It looks like文件系统 V3 在 Boost 1.46 中成为默认文件系统,V2 在 1.48 中从库中删除。解决您的问题的一种可能方法是返回到 1.48 之前的 Boost 版本(并可能使用将 BOOST_FILESYSTEM_VERSION
宏设置为 2 来构建库)。
我已经针对此打开了一个错误,错误报告包括针对 libs/filesystem/src/operations.cpp
的补丁,该补丁修复了该问题:
请记住,我在错误报告中提交的补丁没有经过太多测试(例如,它需要针对其他版本的 Windows 进行测试,使用 MinGW 工具链,路径包含 ASCII 范围之外的字符,目录作为目标,可能还有一些我没有想到的其他事情)。但是,如果您想继续使用最新的 Boost 版本,欢迎您修补您的本地 Boost 库,看看它是否能解决您的问题。
关于c++ - Boost::filesystem::is_empty() 为符号链接(symbolic link)返回 false,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22668337/