使用boost库c++搜索目录和子目录中的文件

2024-01-16

我想创建一个应用程序,使用 c++ 的 boost 库搜索目录和子目录中的文件,我也不想遇到 UNICODE 文件(例如名为 arabic 的文件)的麻烦。 那么我该怎么做呢?

UPDATE:

#include <iostream>
#include <boost/filesystem/operations.hpp>
#include <boost/filesystem/fstream.hpp>
#define BOOST_FILESYSTEM_NO_DEPRECATED
using namespace boost::filesystem;
using namespace std;

bool find_file( const path & dir_path,         // in this directory,
                const std::string & file_name, // search for this name,
                path & path_found )            // placing path here if found
{
  if ( !exists( dir_path ) ) return false;
  directory_iterator end_itr; // default construction yields past-the-end
  for ( directory_iterator itr( dir_path );
        itr != end_itr;
        ++itr )
  {
    if ( is_directory(itr->status()) )
    {
      if ( find_file( itr->path(), file_name, path_found ) ) return true;
    }
    else if ( itr->path().filename() == file_name ) // see below
    {
      path_found = itr->path();
      return true;
    }
  }
  return false;
}

int main()
{
    path myPath = "C:";
    string myFile = ".doc";
    path myfound = "c:";

    find_file(myPath, myFile, myfound);
}

我也尝试了这段代码,但它不会编译它显示这个错误和很多

undefined reference to `boost::filesystem3::path::filename() const

also:

X:\mingw\boost\boost_1_47_0\boost\system\error_code.hpp|214|undefined reference to `boost::system::generic_category()'|

您必须链接 boost_system 和 boost_filesystem 库。如何执行此操作取决于您的编译器/链接器组合;例如,在我的系统上我必须添加标志-lboost_system-mt -lboost_filesystem-mt.

一些备注:在 Windows 上,您通常需要wstring(或其他“宽字符”对象)以增加使用 Unicode 路径的机会。其次,您可以使用以下命令使代码更短find_if and recursive_directory_iterator:

#include <algorithm>
#include <iostream>

#define BOOST_FILESYSTEM_NO_DEPRECATED
#define BOOST_FILESYSTEM_VERSION 3

#include <boost/filesystem.hpp>

using namespace std;
using namespace boost::filesystem;

bool find_file(const path& dir_path, const path& file_name, path& path_found) {
  const recursive_directory_iterator end;
  const auto it = find_if(recursive_directory_iterator(dir_path), end,
                          [&file_name](const directory_entry& e) {
                            return e.path().filename() == file_name;
                          });
  if (it == end) {
    return false;
  } else {
    path_found = it->path();
    return true;
  }
}

int main() {
  const path myPath = L"/usr/local";
  const path myFile = L"filesystem.hpp";
  path myFound;
  find_file(myPath, myFile, myFound);
  wcout << myFound << endl;
}

我的示例使用 C++11 功能auto and lambda,出现在 GCC 4.6 中。如果您的编译器缺少这些,您可以轻松地将 lambda 替换为谓词对象,然后auto通过显式类型说明符:

#include <functional>

class file_name_equal: public unary_function<path, bool> {
public:
  explicit file_name_equal(const path& fname): file_name(fname) { }

  bool operator()(const directory_entry& entry) const {
    return entry.path().filename() == file_name;
  }

private:
  path file_name;
};

bool find_file_cxx03(const path& dir_path, const path& file_name,
                     path& path_found) {
  const recursive_directory_iterator end;
  const recursive_directory_iterator it =
    find_if(recursive_directory_iterator(dir_path), end,
            file_name_equal(file_name));
  if (it == end) {
    return false;
  } else {
    path_found = it->path();
    return true;
  }
}

另一个不错的变体使用 Boost.Optional 摆脱了返回值引用:

...
#include <boost/optional.hpp>

using namespace std;
using namespace boost;
using namespace boost::filesystem;

optional<path> find_file(const path& dir_path, const path& file_name) {
  const recursive_directory_iterator end;
  const auto it = find_if(recursive_directory_iterator(dir_path), end,
                          [&file_name](const directory_entry& e) {
                            return e.path().filename() == file_name;
                          });
  return it == end ? optional<path>() : it->path();
}

int main() {
  const path myPath = L"/usr/local";
  const path myFile = L"filesystem.hpp";
  wcout << find_file(myPath, myFile).get_value_or("not found") << endl;
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

使用boost库c++搜索目录和子目录中的文件 的相关文章

  • 如何在 Android 上的 HttpPost 中发送 unicode 字符

    我试图在我的应用程序中允许多语言支持 这会发出 HTTP post 来上传新消息 我需要做什么才能支持日语和其他非拉丁语语言 我的代码目前看起来像这样 note the msg string is a JSON message by the
  • 自动从 C# 代码进行调试过程并读取寄存器值

    我正在寻找一种方法来读取某个地址的 edx 注册表 就像这个问题中所问的那样 读取eax寄存器 https stackoverflow com questions 16490906 read eax register 虽然我的解决方案需要用
  • 如何在 JavaScript 中从代理对构造 UTF-16 字符?

    以下计算 Unicode 代码点的 UTF 16 代理对 戴着医用口罩的脸 https emojipedia org face with medical mask 但是如何从代理对构造字符以在字符串中使用呢 const codepoint
  • 按字典顺序对整数数组进行排序 C++

    我想按字典顺序对一个大整数数组 例如 100 万个元素 进行排序 Example input 100 21 22 99 1 927 sorted 1 100 21 22 927 99 我用最简单的方法做到了 将所有数字转换为字符串 非常昂贵
  • A* 之间的差异 pA = 新 A;和 A* pA = 新 A();

    在 C 中 以下两个动态对象创建之间的确切区别是什么 A pA new A A pA new A 我做了一些测试 但似乎在这两种情况下 都调用了默认构造函数 并且仅调用了它 我正在寻找性能方面的任何差异 Thanks If A是 POD 类
  • Windows 窗体不会在调试模式下显示

    我最近升级到 VS 2012 我有一组在 VS 2010 中编码的 UI 测试 我试图在 VS 2012 中启动它们 我有一个 Windows 窗体 在开始时显示使用 AssemblyInitialize 属性运行测试 我使用此表单允许用户
  • 线程、进程和 Application.Exit()

    我的应用程序由主消息循环 GUI 和线程 Task Factory 组成 在线程中我调用一些第三方应用程序var p new Process 但是当我调用Application Exit 在消息循环中 我可以看到在线程中启动的进程仍在内存中
  • 初始化变量的不同方式

    在 C 中初始化变量有多种方法 int z 3 与 int 相同z 3 Is int z z 3 same as int z z 3 您可以使用 int z z 3 Or just int z 3 Or int z 3 Or int z i
  • Windows 10 中 Qt 桌面应用程序的缩放不当

    我正在为 Windows 10 编写一个简单的 Qt Widgets Gui 应用程序 我使用的是 Qt 5 6 0 beta 版本 我遇到的问题是它根本无法缩放到我的 Surfacebook 的屏幕上 这有点难以判断 因为 SO 缩放了图
  • 用 C 实现 Unix shell:检查文件是否可执行

    我正在努力用 C 语言实现 Unix shell 目前正在处理相对路径的问题 特别是在输入命令时 现在 我每次都必须输入可执行文件的完整路径 而我宁愿简单地输入 ls 或 cat 我已经设法获取 PATH 环境变量 我的想法是在 字符处拆分
  • C 中的位移位

    如果与有符号整数对应的位模式右移 则 1 vacant bit will be filled by the sign bit 2 vacant bit will be filled by 0 3 The outcome is impleme
  • 检查 url 是否指向文件或页面

    我们需要以下内容 如果文件确实是文件 则从 URL 下载该文件 否则 如果它是一个页面 则什么也不做 举个简单的例子 我有以下命令来下载文件 My Computer Network DownloadFile http www wired c
  • 作为字符串的动态属性名称

    使用 DocumentDB 创建新文档时 我想设置属性名称动态地 目前我设置SomeProperty 像这样 await client CreateDocumentAsync dbs db colls x new SomeProperty
  • 已过时 - OpenCV 的错误模式

    我正在使用 OpenCV 1 进行一些图像处理 并且对 cvSetErrMode 函数 它是 CxCore 的一部分 感到困惑 OpenCV 具有三种错误模式 叶 调用错误处理程序后 程序终止 Parent 程序没有终止 但错误处理程序被调
  • 在Linux中使用C/C++获取机器序列号和CPU ID

    在Linux系统中如何获取机器序列号和CPU ID 示例代码受到高度赞赏 Here http lxr linux no linux v2 6 39 arch x86 include asm processor h L173Linux 内核似
  • 如何使用 ReactiveList 以便在添加新项目时更新 UI

    我正在创建一个带有列表的 Xamarin Forms 应用程序 itemSource 是一个reactiveList 但是 向列表添加新项目不会更新 UI 这样做的正确方法是什么 列表定义 listView new ListView var
  • 如何在 C# 中播放在线资源中的 .mp3 文件?

    我的问题与此非常相似question https stackoverflow com questions 7556672 mp3 play from stream on c sharp 我有音乐网址 网址如http site com aud
  • 将变量分配给另一个变量,并将一个变量的更改反映到另一个变量中

    是否可以将一个变量分配给另一个变量 并且当您更改第二个变量时 更改会瀑布式下降到第一个变量 像这样 int a 0 int b a b 1 现在 b 和 a 都 1 我问这个问题的原因是因为我有 4 个要跟踪的对象 并且我使用名为 curr
  • C++ 成员函数中的“if (!this)”有多糟糕?

    如果我遇到旧代码if this return 在应用程序中 这种风险有多严重 它是一个危险的定时炸弹 需要立即在应用程序范围内进行搜索和销毁工作 还是更像是一种可以悄悄留在原处的代码气味 我不打算writing当然 执行此操作的代码 相反
  • 将 viewbag 从操作控制器传递到部分视图

    我有一个带有部分视图的 mvc 视图 控制器中有一个 ActionResult 方法 它将返回 PartialView 因此 我需要将 ViewBag 数据从 ActionResult 方法传递到 Partial View 这是我的控制器

随机推荐

  • 对 php.ini 的更改未反映在 PHP 的 phpinfo() 中

    我只是无法在本地主机设置或相关的设置上更改 php info 值php我的管理员 https en wikipedia org wiki PhpMyAdmin最大文件大小 所以我找到了 PHP 文件phpinfo https www php
  • 如何对 Laravel Eloquent ORM 对象进行排序?

    例如 我们有一个包含 3 个字段的模型航班 created at 航班创建的时间 name 航班名称 分数 航班的分数 所以我这样写 flights App Flight orderBy created at 我得到一些 flight排序对
  • VBA 下标超出范围 - 错误 9

    有人可以帮我解决这个代码吗 我得到了下标超出范围 error 创建工作表 之后的行在调试器中以黄色突出显示 Validation of year If TextBox Year Value Format TextBox Year Value
  • 该游戏使用哪个布局管理器?

    该游戏使用哪个布局管理器 恕我直言 使用布局和组件并不是解决您问题的好方法 就我个人而言 我倾向于使用自定义绘画解决方案 从一件作品的基本概念开始 它需要知道它的位置 它的大小 它的颜色 能够绘制自己并且可能是可重新定位的 比如 publi
  • 模板约束内的模式匹配

    这个问题是基于安德烈的回答我关于签名限制的问题 https stackoverflow com questions 11378470 signature constrait for generic types struct S int x
  • 捕获整个应用程序中的按键

    是否有可能捕获 我猜是在 app xaml cs 中的某个位置 任何键以及它是否按下了打开的窗口 感谢帮助 有一个更好的办法 成立this https social msdn microsoft com Forums vstudio en
  • 通过 JTA 使用任意资源

    是否可以使用 JTA 进行任何类型的自定义资源事务 让我们假设一个基本示例 并创建一个在发生错误时应回滚的文件夹 这样的自定义资源可以处理吗 是的 该资源需要提供以下实现XA资源 http download oracle com javae
  • struts2 忽略特定模式

    我正在使用 strust2 进行 Web 应用程序开发 我的 struts xml 文件将如下所示
  • JMagick 尝试加载文件时出错 - UnsatisfiedLink

    java lang UnsatisfiedLinkError java library path中没有JMagick 在 java lang ClassLoader loadLibrary ClassLoader java 1754 在 j
  • 自制软件安装错误:“不是有效的参考:refs/remotes/origin/master”?

    我尝试按照以下说明在 macOS Monterey 上安装 Homebrewhttps brew sh https brew sh 但它的结果是 error Not a valid ref refs remotes origin maste
  • 检查主机是否存在的快速方法

    In C 如果我 ping 一个 url 例如 http myurl com 并且该 url 不存在 我会收到 SocketException 不知道这样的主机 此请求是确定地址是否存在的一种非常快速的方法 有没有类似的方法来检查IP是否
  • 设置表单最小尺寸

    我有一个带有相当大边框的 C 表单 我想将最小尺寸设置为 850 760 默认起始尺寸 但是当我尝试在表单属性菜单中设置值时 它不断将其更改为 850 720 我尝试通过代码设置它 如下所示 this minimumSize new Sys
  • 当我用 UIView 覆盖所有屏幕时,如何用 UIView 覆盖 UIStatusBar? (iPhone)

    当我用 UIView 覆盖所有屏幕时 如何用 UIView 覆盖 UIStatusBar 我也纠结了好久要怎么做 终于弄清楚了 关键是将新窗口的 windowLevel 设置为非常高 以便它位于所有其他窗口 视图 状态栏等之上 UIWind
  • 如何使用当前预览版在 .NET Core 上构建本机二进制文件?

    使用当前的 NET Core 预览版 如何编译 发布 控制台应用程序的本机二进制文件 我使用的是 Mac 操作系统 10 11 我做了以下事情 dotnet new dotnet restore dotnet publish 我有点期望 发
  • 如何创建带有 abi 标签的完整轮子?

    尝试从一个空项目创建一个轮子 使用这个setup py setup py from setuptools import setup setup name bla version 1 我调用python setup py bdist whee
  • Google 地图标记可点击区域

    我正在使用这个例子 https github com galex android mapviewballoons https github com galex android mapviewballoons My problem is th
  • 准备 CoreML 模型时出错:CoreML 代码生成不支持“

    我正在修改代码本教程 https www raywenderlich com 164213 coreml and vision machine learning in ios 11 tutorial我收到此错误 为代码生成准备 CoreML
  • 如何在VSTS发布管道空进程中执行exe[关闭]

    Closed 这个问题需要多问focused help closed questions 目前不接受答案 我有 Net 解决方案项目 它有多个项目 其中很少有控制台应用程序 我想在发布管道期间作为空进程下的任务执行控制台应用程序之一 如何从
  • AudioKit - 没有声音输出

    我尝试使用AudioKit输出纯正弦波 https github com AudioKit AudioKit https github com AudioKit AudioKit我尝试建立一个像主页一样的新项目 并且还尝试了 Hello W
  • 使用boost库c++搜索目录和子目录中的文件

    我想创建一个应用程序 使用 c 的 boost 库搜索目录和子目录中的文件 我也不想遇到 UNICODE 文件 例如名为 arabic 的文件 的麻烦 那么我该怎么做呢 UPDATE include