【问题标题】:Boost directory iterator throwing ERROR_INVALID_DRIVEBoost 目录迭代器抛出 ERROR_INVALID_DRIVE
【发布时间】:2019-07-12 11:11:54
【问题描述】:

我观察到 boost (v. 1.64) 目录迭代器构造函数 (directory_iterator(const path& p)) 在 Windows 系统上抛出带有 ERROR_INVALID_DRIVE 的异常。我想问题发生在 NTFS 上,但不能 100% 确定。

  1. ERROR_INVALID_DRIVE 的一般原因是什么?
  2. directory_iterator(const path& p) 里面可能是什么东西?据我了解,它只是列出了一个目录,因此无法在此处找到一种获取无效驱动器的方法

更新:

以下是相关代码:

namespace bfs = boost::filesystem;

bfs::path cache_path("C:/Users/Администратор/AppData/Local/some_unique_path/");

long long dir_size = 0;

boost::system::error_code ec;

int err_no = 0;

for (bfs::directory_iterator it(cache_path), eit; it != eit; it.increment(ec)) {
    if (ec) {
        std::cout << "Error " << 0 << ":" << ec << " while clearing the cache\n";
        return;
    }

    dir_size += bfs::file_size(it->path(), ec);

    if (ec) {
        std::cout << "Error " << 1 << ":" << ec << " while clearing the cache\n";
        return;
    }
}

dir_size >>= 20; // want current cache size in Mb

if (dir_size > new_size) {
    std::cout << "Clearing the kernel cache..." << std::endl;
    // each file is attempted to be removed
    for (bfs::directory_iterator it(cache_path), eit; it != eit; ++it) {
        if (ec) {
            std::cout << "Error " << 2 << ":" << ec << " while clearing the cache\n";
            return;
        }
        bfs::remove(it->path(), ec); // this ec is skipped: don't care if it was impossible to delete file
    }
}

【问题讨论】:

  • 你有 boost 的源代码。只需进入它,直到您到达可能失败的内部 (win32/crt) 函数。找出传递给它的参数并查找该函数的文档。如果这不起作用,请使用这些详细信息编辑问题,我们或许可以提供帮助。
  • @MikeVine,不幸的是,我没有办法直接调试它,因为它发生在我无法访问的机器上,所以这是一个猜谜游戏,很抱歉要求与它一起玩我。我已经用我拥有的所有与 boost:filesystem 模块相关的代码更新了我的问题。也许,它会有所帮助。

标签: c++ boost filesystems


【解决方案1】:

很高兴看到您的一段代码。通常这意味着该目录不存在。请注意,在 Windows 中,目录路径具有以下格式,例如,"C:\dir1\dir2"。由于您没有提供任何源代码示例,因此很难为您提供帮助。也许您只是提供了格式错误的路径。

【讨论】:

  • 我只是认为添加对构造函数的调用不会有太大帮助,但是好的,我已经添加了与 boost 文件系统相关的所有代码,我有。注意用于初始化boost::filesystem::path 的字符串。它使用反斜杠。我认为 windows 能够处理它们,不是吗?
  • 关于反斜杠,我认为它取决于 IDE。您是否尝试将所有 "/" 替换为 "\" ?我认为这就是问题所在。
  • 能否请您详细说明“IDE 依赖”?不幸的是,我不能只是替换,因为它发生在我无法访问的机器上,但正如我从 boost.org/doc/libs/1_33_1/libs/filesystem/doc/path.htm#Grammar 看到的那样,boost 应该处理 Windows 上的反斜杠分隔符,还是我弄错了文档?
  • 我的意思是一些IDE使用它们的“根”目录与源文件的目录相同,其他使用更高的目录。看,您不能直接从C:/ 位置直接访问目录,因为您的程序不知道这一点。尝试使用源文件的本地目录,例如 /../
猜你喜欢
  • 2012-03-10
  • 2017-01-04
  • 2012-11-06
  • 2017-10-18
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-06-30
  • 1970-01-01
相关资源
最近更新 更多