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

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

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

  1. //  filesystem tut3.cpp  ---------------------------------------------------------------//  
  2.   
  3. //  Copyright Beman Dawes 2009  
  4.   
  5. //  Distributed under the Boost Software License, Version 1.0.  
  6. //  See http://www.boost.org/LICENSE_1_0.txt  
  7.   
  8. //  Library home page: http://www.boost.org/libs/filesystem  
  9.   
  10. #include <iostream>  
  11. #include <iterator>  
  12. #include <algorithm>  
  13. #include <boost/filesystem.hpp>  
  14. using namespace std;  
  15. using namespace boost::filesystem;  
  16.   
  17. int main(int argc, char* argv[])  
  18. {  
  19.   if (argc < 2)  
  20.   {  
  21.     cout << "Usage: tut3 path\n";  
  22.     return 1;  
  23.   }  
  24.   
  25.   path p (argv[1]);   // p reads clearer than argv[1] in the following code  
  26.   
  27.   try  
  28.   {  
  29.     if (exists(p))    // does p actually exist?  
  30.     {  
  31.       if (is_regular_file(p))        // is p a regular file?  
  32.         cout << p << " size is " << file_size(p) << '\n';  
  33.   
  34.       else if (is_directory(p))      // is p a directory?  
  35.       {  
  36.         cout << p << " is a directory containing:\n";  
  37.   
  38.         copy(directory_iterator(p), directory_iterator(),  // directory_iterator::value_type  
  39.           ostream_iterator<directory_entry>(cout, "\n"));  // is directory_entry, which is  
  40.                                                            // converted to a path by the  
  41.                                                            // path stream inserter  
  42.       }  
  43.       else  
  44.         cout << p << " exists, but is neither a regular file nor a directory\n";  
  45.     }  
  46.     else  
  47.       cout << p << " does not exist\n";  
  48.   }  
  49.   
  50.   catch (const filesystem_error& ex)  
  51.   {  
  52.     cout << ex.what() << '\n';  
  53.   }  
  54.   
  55.   return 0;  
  56. }  
然而,每次写程序都要附上如此一大篇代码,很不美观。故作了简单封装。

.h文件

  1. #ifndef DIRFILEOPT_HHHH  
  2. #define DIRFILEOPT_HHHH  
  3.   
  4. #include <iostream>  
  5. #include <vector>  
  6. #include <string>  
  7.   
  8. using std::vector;  
  9. using std::string;  
  10.   
  11. class CFileOpt  
  12. {  
  13. private:  
  14.     bool m_bIsDir;  
  15.     bool m_bIsFile;  
  16.     char* m_pFileName;  
  17.     bool mDirOrFile();  
  18.   
  19. public:  
  20.     CFileOpt(char*);  
  21.     vector<string>& mGetSubFiles(vector<string>& lstpFileNames);  
  22.     ~CFileOpt();  
  23. };#endif  
.cpp文件
  1. #define _SCL_SECURE_NO_WARNINGS  
  2. #include "FileOpt.h"  
  3. #include <iterator>  
  4. #include <algorithm>  
  5. #include <boost/filesystem.hpp>  
  6. #include <boost/algorithm/string/classification.hpp>  
  7. #include <boost/algorithm/string.hpp>  
  8. using namespace std;  
  9. using namespace boost::filesystem;  
  10.   
  11. bool CFileOpt::mDirOrFile()  
  12. {  
  13.     if(NULL == m_pFileName)  
  14.         return false;  
  15.     path p(m_pFileName);  
  16.     try{  
  17.         if(exists(p)){     
  18.             if (is_regular_file(p))         
  19.                 m_bIsFile = true;             
  20.             else if (is_directory(p)){  
  21.                 m_bIsDir = true;  
  22.             }  
  23.         }else{  
  24.             return false;  
  25.         }  
  26.     }catch (const filesystem_error& ex){  
  27. #ifdef DEBUG  
  28.         printf(ex.what());  
  29. #endif  
  30.     }  
  31.     return true;  
  32. }  
  33. CFileOpt::CFileOpt(char* pfilename):  
  34.     m_pFileName(pfilename),m_bIsDir(false),m_bIsFile(false){  
  35.         mDirOrFile();  
  36. }  
  37. vector<string>& CFileOpt::mGetSubFiles(vector<string>& lstpFileNames)  
  38. {  
  39.     if(m_bIsDir){  
  40.         path p(m_pFileName);  
  41.         typedef vector<path> vec;             // store paths,  
  42.         vec pathes;  
  43. #ifdef DEBUG  
  44.     copy(directory_iterator(p), directory_iterator(),ostream_iterator<directory_entry>(cout,"\n"));  
  45. #endif  
  46.         copy(directory_iterator(p), directory_iterator(), back_inserter(pathes));  
  47.         for(auto iter = pathes.begin();iter != pathes.end();iter ++){  
  48.             lstpFileNames.push_back(iter->generic_string());  
  49.         }  
  50.         return lstpFileNames;  
  51.     }else{  
  52. #ifdef DEBUG  
  53.         printf("No SubFiles In %s\n",m_pFileName);  
  54. #endif  
  55.     }  
  56.     return lstpFileNames;  
  57. }  
  58. CFileOpt::~CFileOpt(){  
  59.     m_pFileName = NULL;  
  60. }  
调用构造函数,传入文件夹的名字,通过mGetSubFiles()函数就可以返回文件夹内的文件路径。
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 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、付费专栏及课程。

余额充值