【问题标题】:boost::filesystem exists() on directory path fails, but is_directory() is ok目录路径上的 boost::filesystem exists() 失败,但 is_directory() 没问题
【发布时间】:2011-01-13 07:39:55
【问题描述】:

我正在使用 boost 文件系统获取当前目录的路径,然后检查该目录是否存在。

is_directory() 没问题,但 exists() 在同一路径上失败,我错过了什么吗?

示例代码(提升 1.35):

#include <boost/filesystem/operations.hpp>
#include <boost/filesystem/path.hpp>

namespace fs = boost::filesystem;

// the path is full path /home/my/somedirectory    
fs::path data_dir(fs::current_path());

fs::is_directory(data_dir)  // true, directory exists

fs::exists(data_dir)   // false
exists(status(data_dir))  // false

编辑:

#include <boost/filesystem/operations.hpp>
#include <boost/filesystem/path.hpp>
namespace fs = boost::filesystem;

fs::path data_dir(fs::current_path());
// data_dir == "/home/myusername/proj/test"

if (fs::is_directory(data_dir))             // true - is directory
if (fs::is_directory(fs::status(data_dir))) // true - it is still a directory

有趣的部分:

if (fs::exists(fs::status(data_dir)))       // true - directory exists
if (fs::exists( data_dir ))                 // true - directory exists

但是:

if (!fs::exists(fs::status(data_dir)))      // false - directory still exists
if (!fs::exists( data_dir ))                // true  - directory does not exists

【问题讨论】:

  • 您使用的是 Windows 吗?这是底层 Windows API 的已知限制。
  • 在 Windows 上为我工作。

标签: boost boost-filesystem


【解决方案1】:

以下来自Boost源码:

inline bool is_directory( file_status f ) { return f.type() == directory_file; }
inline bool exists( file_status f )       { return f.type() != status_unknown && f.type() != file_not_found; }

如您所见,如果 is_directory 返回 true,那么 exists 也必须返回 true。也许问题出在您的代码中的其他地方 - 请发布一个显示问题的最小可编译示例。

您可能还想尝试对两个调用使用相同的 file_status 对象,以查看输出 status 是否发生了变化。

【讨论】:

  • 您发布了一些 sn-ps,而不是可编译的示例。
  • 顺便说一句,我将path 传递给exists() 而不是file_status,有一个函数接受path 并根据文档返回exists(status(path))
  • ...仍然不是一个完整的例子(ifs 里面有什么?)。无论如何,您的新编辑没有意义:您是说否定 if 的条件会改变 Boost 返回的值吗?可能这是您代码中的一个简单问题,例如在 if 之后放置一个分号。
  • +1 :) 你是对的...复制代码时我错过了半色 :),同时发生的事情太多...
猜你喜欢
  • 2020-11-12
  • 1970-01-01
  • 2011-04-25
  • 1970-01-01
  • 1970-01-01
  • 2017-08-16
  • 2012-04-27
  • 2011-02-15
  • 1970-01-01
相关资源
最近更新 更多