c++ - Boost::filesystem::is_empty() 为符号链接(symbolic link)返回 false

标签 c++ windows boost symlink boost-filesystem

直到一周前,我一直在我的项目中使用 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/

相关文章:

c++ - 将 vector bool 复制到 CUDA 内存时出错

c++ - 为什么 MinGW 没有默认安装 gcc 4.x.x 系列编译器?

c++ - 内联静态成员变量

c# - 我需要查看哪些 API 来编写我自己的 Windows 驱动器号

c++ - boost::spirit::qi 和乱序变量

C++ - 在 map 中搜索具有相同值的所有键的最快方法是什么?

c++ - 错误 : Invalid options syntax: -//tensorflow:libtensorflow_cc. 所以

windows - 如何在 Perl 中以管理员模式打开命令提示符

c++ - boost::asio::io_service::在多个线程中运行

c++ - 在 Visual Studio 6 中从 VB 调用 VS2010 C++ dll