gpt4 book ai didi

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

转载 作者:可可西里 更新时间:2023-11-01 09:34:01 24 4
gpt4 key购买 nike

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

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com