c++ 利用boost 实现文件操作

       对文件夹里面的文件进行遍历操作是基本技能之一,python,perl以及bash等脚本都很好的实现了文件遍历方法,对于c/c++来说,只能通过系统自定的api获取。虽然文件夹操作本身是调用操作系统内核的接口,但毕竟接口不够友好。

       boost不愧是准标准库,filesystem提供了极为简便的方法,如下所示:

//  filesystem tut3.cpp  ---------------------------------------------------------------//

//  Copyright Beman Dawes 2009

//  Distributed under the Boost Software License, Version 1.0.
//  See http://www.boost.org/LICENSE_1_0.txt

//  Library home page: http://www.boost.org/libs/filesystem

#include <iostream>
#include <iterator>
#include <algorithm>
#include <boost/filesystem.hpp>
using namespace std;
using namespace boost::filesystem;

int main(int argc, char* argv[])
{
  if (argc < 2)
  {
    cout << "Usage: tut3 path\n";
    return 1;
  }

  path p (argv[1]);   // p reads clearer than argv[1] in the following code

  try
  {
    if (exists(p))    // does p actually exist?
    {
      if (is_regular_file(p))        // is p a regular file?
        cout << p << " size is " << file_size(p) << '\n';

      else if (is_directory(p))      // is p a directory?
      {
        cout << p << " is a directory containing:\n";

        copy(directory_iterator(p), directory_iterator(),  // directory_iterator::value_type
          ostream_iterator<directory_entry>(cout, "\n"));  // is directory_entry, which is
                                                           // converted to a path by the
                                                           // path stream inserter
      }
      else
        cout << p << " exists, but is neither a regular file nor a directory\n";
    }
    else
      cout << p << " does not exist\n";
  }

  catch (const filesystem_error& ex)
  {
    cout << ex.what() << '\n';
  }

  return 0;
}

然而,每次写程序都要附上如此一大篇代码,很不美观。故作了简单封装。

.h文件

#ifndef DIRFILEOPT_HHHH
#define DIRFILEOPT_HHHH

#include <iostream>
#include <vector>
#include <string>

using std::vector;
using std::string;

class CFileOpt
{
private:
	bool m_bIsDir;
	bool m_bIsFile;
	char* m_pFileName;
	bool mDirOrFile();

public:
	CFileOpt(char*);
	vector<string>& mGetSubFiles(vector<string>& lstpFileNames);
	~CFileOpt();
};#endif
.cpp文件

#define _SCL_SECURE_NO_WARNINGS
#include "FileOpt.h"
#include <iterator>
#include <algorithm>
#include <boost/filesystem.hpp>
#include <boost/algorithm/string/classification.hpp>
#include <boost/algorithm/string.hpp>
using namespace std;
using namespace boost::filesystem;

bool CFileOpt::mDirOrFile()
{
	if(NULL == m_pFileName)
		return false;
	path p(m_pFileName);
	try{
		if(exists(p)){   
			if (is_regular_file(p))       
				m_bIsFile = true;			
			else if (is_directory(p)){
				m_bIsDir = true;
			}
		}else{
			return false;
		}
	}catch (const filesystem_error& ex){
#ifdef DEBUG
		printf(ex.what());
#endif
	}
	return true;
}
CFileOpt::CFileOpt(char* pfilename):
	m_pFileName(pfilename),m_bIsDir(false),m_bIsFile(false){
		mDirOrFile();
}
vector<string>& CFileOpt::mGetSubFiles(vector<string>& lstpFileNames)
{
	if(m_bIsDir){
		path p(m_pFileName);
		typedef vector<path> vec;             // store paths,
		vec pathes;
#ifdef DEBUG
	copy(directory_iterator(p), directory_iterator(),ostream_iterator<directory_entry>(cout,"\n"));
#endif
		copy(directory_iterator(p), directory_iterator(), back_inserter(pathes));
		for(auto iter = pathes.begin();iter != pathes.end();iter ++){
			lstpFileNames.push_back(iter->generic_string());
		}
		return lstpFileNames;
	}else{
#ifdef DEBUG
		printf("No SubFiles In %s\n",m_pFileName);
#endif
	}
	return lstpFileNames;
}
CFileOpt::~CFileOpt(){
	m_pFileName = NULL;
}
调用构造函数,传入文件夹的名字,通过mGetSubFiles()函数就可以返回文件夹内的文件路径

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: Boost是一个在C++标准库之上提供可移植、跨平台的增强功能的开源库。Boost.http是Boost库中的一个模块,它提供了HTTP协议的支持,使得C++程序能够更方便地实现HTTP通信。 Boost.http库提供了一组类和函数,用于处理HTTP请求和响应。通过这些类和函数,我们可以方便地发送HTTP请求、接收HTTP响应,并处理请求和响应的各种属性,例如请求头、响应头、请求参数等。 在使用Boost.http库实现HTTP功能时,我们首先需要创建一个HTTP客户端或服务器对象。客户端对象用于发送HTTP请求,而服务器对象用于接收和处理HTTP请求。 对于HTTP客户端,我们可以使用boost::beast::http::request类来构造HTTP请求并发送,例如构造一个GET请求发送到指定的URL地址。在发送请求后,我们可以通过读取boost::beast::http::response类来获取HTTP响应。 对于HTTP服务器,我们可以使用boost::beast::http::request_parser类来解析接收到的HTTP请求,然后根据请求的内容进行相应的处理。处理完毕后,可以使用boost::beast::http::response_creator类来构造HTTP响应并发送回客户端。 Boost.http库还提供了其他一些有用的功能,例如重定向、处理cookie、处理SSL等。 通过使用Boost.http库,我们可以更方便地实现基于HTTP协议的网络通信功能。而且,由于Boost库的可移植性和跨平台性,我们的代码可以在不同的操作系统和编译器上运行,极大地增强了程序的可移植性和可扩展性。 ### 回答2: C++是一种强大的编程语言,而Boost库则是C++语言中的一个重要工具。Boost库提供了大量的功能和算法,可以帮助开发者更高效地进行C++编程。其中,Boost库中的Boost.Asio模块提供了对HTTP/HTTPS和网络编程的支持。 在Boost库中使用Boost.Asio模块实现HTTP/Web功能,需要以下步骤: 1. 引入Boost库:首先,我们需要在自己的项目中引入Boost库。可以通过下载Boost库源代码并进行编译,或者直接使用已经编译好的二进制包。 2. 包含Asio头文件:在我们的代码中,需要包含Asio头文件,以便使用其中提供的HTTP/HTTPS和网络编程相关类和函数。 3. 创建HTTP请求和响应:使用Asio提供的类和函数,我们可以创建HTTP请求和响应对象,并设置相应的请求方法、URL、头部信息等。 4. 发送HTTP请求:通过Asio提供的socket对象,我们可以将HTTP请求发送到服务器,并等待服务器的响应。 5. 接收HTTP响应:当服务器返回响应时,我们可以使用Asio提供的相应函数,将响应内容保存到相应的数据结构中,以便我们进一步处理。 6. 处理响应:根据服务器返回的HTTP响应内容,我们可以进行相应的处理,如解析HTML、处理JSON数据等。 7. 关闭连接:当所有的请求和响应处理完成后,我们可以关闭与服务器的连接。 使用Boost库的Asio模块,我们可以很方便地实现HTTP/Web功能,包括发送HTTP请求、接收和处理服务器的响应等。通过充分利用Boost库的强大功能,我们可以编写高效、稳定的C++代码,实现各种应用程序中的网络功能。 ### 回答3: C++是一种高级编程语言,常用于开发高性能和跨平台的应用程序。Boost库是一个开源的C++库,提供了很多通用的功能组件和工具,用于增强C++程序的功能。而HTTP是一种基于客户端-服务器模型的协议,用于在Web上进行数据通信。 在C++中,我们可以使用Boost库中的ASIO模块来实现基于HTTP的Web应用程序。ASIO(Asynchronous Input/Output)是一种基于事件驱动的异步I/O库,能够实现高效的网络通信。 为了实现HTTP的功能,我们可以使用Boost库中的HTTP模块。这个模块提供了HTTP的解析器和生成器,可以用于解析HTTP请求和构建HTTP响应。 使用Boost实现HTTP Web应用程序的一般步骤如下: 1. 导入Boost库:在C++项目中,首先需要将Boost库导入到项目中。可以从官方网站下载编译好的Boost库,然后将其链接到项目中。 2. 创建HTTP服务器:使用Boost库的ASIO模块创建一个HTTP服务器对象。这个服务器将监听指定的端口,接收和处理客户端的HTTP请求。 3. 处理HTTP请求:当服务器接收到客户端的HTTP请求时,使用Boost库中的HTTP模块解析该请求,并提取请求的内容以及其他相关信息。根据请求的内容和参数,执行相应的操作。 4. 响应HTTP请求:根据处理结果,使用Boost库中的HTTP模块生成HTTP响应,并将其发送给客户端。HTTP响应包括状态码、响应头和响应体等内容。 5. 清理资源:在服务器不再需要监听请求时,需要及时关闭服务器对象,并清理相关的资源。 总结起来,使用Boost库的ASIO和HTTP模块,可以方便地实现基于HTTP的Web应用程序。通过解析HTTP请求和生成HTTP响应,我们可以实现各种功能,如网页服务、文件传输、数据交互等。 Boost库提供了丰富的功能和工具,可以大大提高C++程序的开发效率和性能。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值