了解 Boost Filesystem Library
boost库的介绍
Boost是什么?一套开放源代码、高度可移植的C++库。
谁发起的?C++标准委员会库工作组。
所以,质量保证,不怕遇到假冒伪劣产品。
Boost内容广泛,数值计算、泛型编程、元编程、平台API……不妨从容选择自己感兴趣的部分,细细品味。
有些什么呢?瞧瞧:字符串及文本处理Boost.Regex正则表达式是解决大量模式匹配问题的基础。
它们常用于处理大的字符串,子串模糊查找,按某种格式tokenize字符串,或者是基于某种规则修改字符串。
由于C++没有提供正则表达式支持,使得有些用户被迫转向其它支持正则表达式的语言,如Perl, awk, 和 sed。
Regex提供了高效和强大的正则表达式支持,基于与STL同样的前提而设计,这使得它很容易使用。
Regex已被即将发布的Library Technical Report接受。
更多的信息,请见"Library 5: Regex.".Boost.SpiritSpirit库是一个多用途的、递归的语法分析器生成框架。
有了它,你可以创建命令行分析器,甚至是语言预处理器[1]。
它允许程序员直接在C++代码里使用(近似于)EBNF的语法来指定语法规则。
分析器非常难写,对于一个特定的问题,它们很快就变得难于维护和看懂。
而Spirit解决了这些问题,而且达到了与手工制作的分析器一样或几乎一样的性能。
Boost.String_algo这是一组与字符串相关的算法。
包括很多有用的算法,用于大小写转换,空格清除,字符串分割,查找及替换,等等。
这组算法是目前C++标准库里已有功能的扩展。
Boost.Tokenizer这个库提供了把字符序列分割成记号(token)的方法。
通用的语法分析任务包括了在已分割的文本流里查找数据。
如果可以把字符序列视为多个元素的容器将很有帮助,容器中的元素被执照用户定义的规则所分割。
语法分析就成为了在这些元素上进行操作的单个任务,Tokenizer正好提供了这种功能。
WindowsMinGW安装Boost与CLion的配置
WindowsMinGW安装Boost与CLion的配置关于 boost 在 Windows 下的使⽤ gcc 安装与 CLion 的配置, 能够查到的英⽂资料都⽐较少, 踩过坑后记录⼀下.MinGW 安装 Boost下载并解压 Boost ⽂件夹到⼀个稳定的⽂件夹, 此时我的⽂件名为 boost_1_69_0.在进⾏以下⼏步之前请先把 gcc 添加⾄环境变量.在该⽂件夹⽬录下打开命令⾏, ⾸先执⾏:bootstrap gcc 如果你只安装指定的少数⼏个库, 可以使⽤:b2 --show-libraries 得到你可以在这⾥单独安装的所有库的名称. 然后你可以安装指定的某个库, 如 program_options 和 filesystem:b2 toolset=gcc --with-program_options --with-filesystem 或者你想⼀次性编译完毕, 以后就⽆需再进⾏编译:b2 toolset=gcc 以上的指令复制⾄ cmd 可直接执⾏全部编译完成的时间视处理器性能⽽定, ⼤概在⼗分钟左右.此时你可以在 boost 根⽬录下的 stage/lib ⽂件夹下看到以 a 为⽂件扩展名的静态库.CLion CMakeLists 配置 Boost⽹上搜索到的教程容易导致以下⼏个误区认为链接库的⽂件夹⽬录在 bootstrap_1_69_0/libs 下⽆法找到原因为什么⽆法成功 find_package在 Boost 的配置中, 需要指明 BOOST_ROOT, BOOST_INCLUDEDIR, BOOST_LIBRARYDIR 这三个变量. 我的 boost ⽂件夹放在 C:/Local :set(Boost_DEBUG on)set(Boost_DETAILED_FAILURE_MSG ON)#查看 Boost 配置问题所在set(BOOST_ROOT C:/Local/Boost_1_69_0)set(BOOST_INCLUDEDIR ${BOOST_ROOT})set(BOOST_LIBRARYDIR ${BOOST_ROOT}/stage/lib)find_package(Boost COMPONENTS REQUIRED program_options)提⽰ find_package 失败.查看 debug 信息:-- [ .../FindBoost.cmake:1809 ] Searching for PROGRAM_OPTIONS_LIBRARY_RELEASE: boost_program_options-mgw51-mt-1_69;boost_program_options-mgw51-mt;boost_program_options-mt-1_69;boost_program_options-mt;boost_program_options-mt;boos -- [ .../FindBoost.cmake:1862 ] Searching for PROGRAM_OPTIONS_LIBRARY_DEBUG: boost_program_options-mgw51-mt-d-1_69;boost_program_options-mgw51-mt-d;boost_program_options-mt-d-1_69;boost_program_options-mt-d;boost_program_options-m 此时对照 stage/lib ⽂件夹下的⽂件名, 发现名称为libboost_program_options-mgw51-mt-d-x64-1_69.a 或libboost_program_options-mgw51-mt-d-x32-1_69.a因此, 只需将 x64 ⽂件中的⽂件名删掉 “-x64” 即可.故在 stage ⽂件夹下新建⼀个 python3 重命名⽂件脚本:# -*- coding: utf-8 -*-# renamer.pyfrom os import listdir, renameimport refor filename in listdir('lib'):new_filename = re.sub('libboost(.*)-x64(.*).a', r'libboost\1\2.a', filename)rename('lib/' + filename, 'lib/' + new_filename)执⾏后再次进⾏ cmake, 就可以成功 find_package此时按照⽹上教程, 完整的 CMakeLists.txt 为:cmake_minimum_required(VERSION 3.13)project(dot)set(CMAKE_CXX_STANDARD 14)set(Boost_DETAILED_FAILURE_MSG ON)set(Boost_DEBUG on)set(BOOST_ROOT C:/Local/Boost_1_69_0)set(BOOST_INCLUDEDIR ${BOOST_ROOT})set(BOOST_LIBRARYDIR ${BOOST_ROOT}/stage/lib)find_package(Boost COMPONENTS REQUIRED filesystem program_options)add_executable(dot main.cpp command.h)include_directories(${BOOST_ROOT})target_link_libraries(dot ${Boost_LIBRARIES})#Boost_LIBRARIES 为 find_package ⾃动⽣成的变量 CLion 配置 Boost 完成.参考资料(编译时mingw位数需要与系统对应)。
filesystem库用法
filesystem库用法文件系统库(filesystem library)是C++17新增的标准库之一,用于简化和统一文件和目录的操作。
使用filesystem库的一般步骤如下:1. 包含头文件:`#include <filesystem>`2. 命名空间:`using namespace std::filesystem;`3. 使用库中的功能,例如:- 创建目录:`create_directory(path);`- 删除目录或文件:`remove(path);`- 拷贝或移动目录或文件:`copy(path1, path2);` 或`rename(path1, path2);`- 获取文件大小:`file_size(path);`- 判断路径是否存在:`exists(path);`- 判断是否为目录:`is_directory(path);`- 遍历目录中的文件和子目录:使用迭代器或递归函数等。
以下是一个简单的示例代码,演示了filesystem库的基本用法:```cpp#include <iostream>#include <filesystem>using namespace std::filesystem;int main() {path filePath = "path/to/file.txt";if (exists(filePath)) {if (is_directory(filePath)) {std::cout << "Path is a directory." << std::endl;} else {std::cout << "Path is a file." << std::endl;std::cout << "Size: " << file_size(filePath) << " bytes." << std::endl;}} else {std::cout << "Path does not exist." << std::endl;}return 0;}```上述代码会判断给定的路径是否存在,并输出路径类型(文件还是目录)和文件大小(如果是文件的话)。
boost::filesystem总结
boost::filesystem总结boost::filesystem是Boost C++ Libraries中的⼀个模块,主要作⽤是处理⽂件(Files)和⽬录(Directories)。
该模块提供的类boost::filesystem::path专门⽤来处理路径。
⽽且,该模块中还有很多独⽴的函数能够⽤来执⾏创建⽬录、检查⽂件是否存在等任务。
⼀、创建Paths定义路径时需要包含头⽂件boost/filesystem.hpp,并且使⽤命名空间boost::filesystem;路径的创建很简单,仅仅需要向类boost::filesystem::path()的构造器传递⼀个string;构造器的输⼊可以是⼀个没有意义的字符串,因为构造器不会去检测该路径是否是合法路径及是否存在;path对象是⼀个跨平台的路径对象。
path对象的属性有下列这些:1) path.string() 输出字符串形式的路径2) path.stem() ⽂件名,不带扩展名3) path.extension() 返回⽂件扩展名更详细的内容见。
⼆、⽂件和⽬录该部分包括下列函数:boost::filesystem::status(path) 查询⽂件或⽬录的状态,返回的是boost::filesystem::file_status类型的对象boost::filesystem::is_directory() 根据获取的状态判断是否是⽬录,返回boolboost::filesystem::is_empty() 判断是否为空boost::filesystem::is_regular_file() 根据获取的状态判断是否是普通⽂件,返回boolboost::filesystem::is_symlink() 判断符号连接(在windows系统中,后缀为lnk的⽂件为连接⽂件)boost::filesystem::exists() 判断是否存在boost::filesystem::file_size() 返回⽂件的size,按bytes计算boost::filesystem::last_write_time() 返回⽂件最后⼀次修改的时间boost::filesystem::space() 返回磁盘的总空间和剩余空间,boost::filesystem::create_directory() 创建⽬录boost::filesystem::create_directories() 递归创建整个⽬录结构boost::filesystem::remove() 删除⽬录boost::filesystem::remove_all() 递归删除整个⽬录结构boost::filesystem::rename() 重命名⽬录boost::filesystem::copy_file() 复制⽂件boost::filesystem::copy_directory() 复制⽬录boost::filesystem::absolute() 获取⽂件或⽬录的绝对路径boost::filesystem::current_path() 如果没有参数传⼊,则返回当前⼯作⽬录;否则,则将传⼊的⽬录设为当前⼯作⽬录三、⽬录迭代(Directory Iterators)boost::filesystem::directory_iterator() 迭代⽬录下的所有⽂件boost::filesystem::recursive_directory_iterator() 递归地遍历⼀个⽬录和⼦⽬录,也就是迭代整个⽬录结构下的所有⽂件四、⽂件流(File Streams)头⽂件<fstream>定义的⽂件流不能将boost::filesystem::path定义的⽬录作为参数。
boost常用库的使用介绍 第一讲
6
第五节:一个简单的测试用例
#include <vector> #include <iostream> #include <boost/foreach.hpp> #include <boost/assign.hpp> #include <boost/timer.hpp> //用于测试编译后的date_time lib是否正确 #pragma comment(lib, “libboost_date_time-vc90-mt-1_53.lib”) int main() { std::vector<int> v = (boost::assign::list_of(1),2,3,4,5); BOOST_FOREACH(int x,v) { std::cout << x << ","; } std::cout << std::endl; boost::timer t; std::cout << t.elapsed() << “ s “ << std::endl; return 0; } 编译链接通过,运行程序,说明您boost正确安装,刚才编译的date_time库也没问题,恭喜!! 7
2
第二节:安装boost库
• 登陆网站
下载boost_1_53_0.7z,大约50兆(window适用,本教程只针对windows进行讲解)。
• 将上述下载的7z压缩包解压到任意目录
例如d:\boost_1_53_0,解压后大约有450多兆。
• 解压后主要的目录如下
双击bootstrap.bat运行批处理程序。
生成b2.exe和bjam.exe这两个应用程序,bjam.exe是早期编译boost库的应用程序,我们使用b2.exe来进行编译。
boost常用库的使用介绍第一讲
boost常用库的使用介绍第一讲[object Object]Boost是一个C++库集合,包含了许多常用的工具和组件,用于增强C++的功能和性能。
Boost库广泛应用于各种领域,如网络编程、多线程、数据结构、算法等。
Boost库的使用可以大大简化C++开发过程,提高开发效率。
下面是一些常用的Boost库和它们的使用介绍:1. Boost.Filesystem:用于处理文件和目录的库。
它提供了一组易于使用和跨平台的API,可以进行文件和目录的创建、删除、移动、复制等操作。
2. Boost.Regex:正则表达式库,提供了强大的正则表达式功能,可以进行字符串匹配、替换等操作。
Boost.Regex支持多种正则表达式语法,包括Perl、ECMAScript等。
3. Boost.Thread:多线程库,提供了线程的创建、同步、互斥等功能。
Boost.Thread可以简化多线程编程,提高程序的并发性能。
4. Boost.Asio:网络编程库,提供了异步网络编程的功能。
它支持TCP、UDP、SSL等协议,可以用于开发高性能的网络应用程序。
5. Boost.SmartPtr:智能指针库,提供了shared_ptr、weak_ptr等智能指针类,用于管理动态分配的内存。
使用智能指针可以避免内存泄漏和悬挂指针等问题。
6. Boost.Algorithm:算法库,提供了一系列常用的算法,如排序、查找、字符串处理等。
Boost.Algorithm可以方便地进行各种数据处理操作。
7. Boost.Date_Time:日期和时间库,提供了日期和时间的表示、计算和格式化等功能。
它支持多种日期和时间表示方式,如Gregorian、Julian等。
8. Boost.Serialization:序列化库,用于将对象转换成字节流或从字节流中恢复对象。
Boost.Serialization可以方便地进行对象的序列化和反序列化操作。
Boost库学习指南与使用说明
Boost库学习指南与使用说明Boost库学习指南与使用说明一、简介1.1 Boost库概述1.2 Boost库的优势1.3 Boost库的应用领域二、安装与配置2.1 Boost库2.2 解压并安装Boost库2.3 设置Boost库环境变量三、常用模块介绍3.1 模块3.1.1 文件系统操作函数3.1.2 文件和目录迭代器3.2 Regex模块3.2.1 正则表达式语法3.2.2 正则表达式的使用方法3.3 Smart Pointers模块3.3.1 shared_ptr类3.3.2 unique_ptr类3.4 Thread模块3.4.1 线程的创建与管理3.4.2 线程同步与互斥四、常见问题与解决方案4.1 Boost库的兼容性问题4.2 Boost库的编译问题4.3 Boost库的运行时问题五、实例与案例分析5.1 使用模块进行文件操作5.2 使用Regex模块进行字符串匹配5.3 使用Smart Pointers模块管理动态内存 5.4 使用Thread模块实现并行计算附件:1: Boost库官方文档(boost_documentation:pdf)2: Boost库示例代码(boost_examples:zip)注释:1: Boost库:一个由C++标准库扩展而来的开源C++库,提供了大量的功能模块,广泛应用于软件开发领域。
2:环境变量:操作系统中存储了一些用于指定操作系统运行环境的参数值的特殊变量。
3:迭代器:访问一个容器(如数组、列表、集合等)中的元素的指针或引用。
4:正则表达式:一种描述字符串模式的语法规则,用于进行字符串的匹配和替换等操作。
5:共享指针:一种智能指针,允许多个指针共享同一个对象,并在所有共享指针都释放对象后自动销毁对象。
6:独占指针:一种智能指针,采用独占所有权的方式管理动态分配的对象,并在指针被销毁时自动释放对象。
7:线程:一个独立的执行路径,可以同时进行多个线程的执行,实现程序的并发执行。
boost 编译参数
boost 编译参数boost是一个开源的C++库,提供了丰富的功能和工具,用于增强C++的性能和功能。
在编译boost库时,可以使用不同的编译参数来优化编译过程和生成的代码。
本文将介绍几个常用的boost编译参数,并对其功能和用法进行详细说明。
一、--with-<library>参数--with-<library>参数用于指定需要编译的boost库。
boost库提供了很多模块,如system、filesystem、thread等,可以根据具体需求选择需要编译的模块。
例如,使用--with-system参数可以编译boost.system库,用于处理系统相关的功能。
二、--without-<library>参数--without-<library>参数用于指定不需要编译的boost库。
如果不需要某个库的功能,可以使用该参数禁用对应的库的编译。
例如,使用--without-regex参数可以禁用正则表达式库的编译。
三、--build-type参数--build-type参数用于指定编译类型,常用的取值有debug和release。
debug类型用于调试和测试,生成的代码包含调试信息;release类型用于发布,生成的代码进行了优化,更加高效。
可以根据具体需求选择编译类型。
四、--toolset参数--toolset参数用于指定编译工具集,如gcc、clang、msvc等。
不同的编译工具集有不同的编译器和选项,可以根据具体需求选择合适的编译工具集。
例如,使用--toolset=gcc可以指定使用gcc编译器进行编译。
五、--cxxflags参数--cxxflags参数用于指定额外的编译选项。
可以使用该参数添加自定义的编译选项,如优化级别、警告级别等。
例如,使用--cxxflags="-O2 -Wall"可以指定编译器使用级别为2的优化,并开启所有警告。
Boost库概览
1.Boost库概览1.1. 按字母序1.1.1.Any用于存储不同类型的值的安全的泛型容器。
作者Kevlin Henney第一次发布 1.23.0标准构建和连接仅头文件1.1.2.Array与STL兼容的常量大小的数组的容器包装类。
作者Nicolai Josuttis第一次发布 1.17.0标准TR1构建和连接仅头文件1.1.3.Asio可移植的网络库,包括Socket、计时器、域名解析和Socket流。
作者Chris Kohlhoff第一次发布 1.35.0标准构建和连接仅头文件1.1.4.Assign非常方便地使用常数或者生成数据填充容器。
作者Thorsten Ottosen第一次发布 1.32.0标准构建和连接仅头文件1.1.5.Bimap双向map库;使用Boost.Bimap,你可以创建两个类型都可作为键值的关联容器。
作者Matias Capeletto第一次发布 1.35.0构建和连接仅头文件1.1.6.Bindboost::bind是标准函数std::bind1st和std::bind2nd的泛化。
它支持任意函数对象、函数、函数指针和成员函数指针,也能够用于绑定任何参数到一个特定的值或者路由输入参数到任意位置。
作者Peter Dimov第一次发布 1.25.0标准TR1构建和连接仅头文件1.1.7.CRCBoost CRC库提供了CRC(循环冗余校验码)计算对象的两个实现和CRC计算函数的两个实现。
实现是基于模板的。
作者Daryle Walker第一次发布 1.22.0标准构建和连接仅头文件1.1.8.Call Traits为参数传递定义了类型。
作者John Maddock, Howard Hinnant等第一次发布 1.13.0标准构建和连接仅头文件1.1.9.Circular Buffer一个STL兼容的容器,也被广泛称为环缓冲区或者循环缓冲区。
作者Jan Gaspar第一次发布 1.35.0标准构建和连接仅头文件patibility帮助非标准兼容的库。
boost 面试题
boost 面试题一、简介Boost 是一个开源的C++ 库集合,提供了许多高质量的组件和工具,被广泛用于 C++ 程序开发。
在面试过程中,经常会遇到与 Boost 相关的面试题目。
本文将介绍一些常见的 Boost 面试题,并附上相应的解答,希望能够帮助读者更好地准备面试。
二、常见问题1. Boost 是什么?为什么要使用 Boost?Boost 是一个由 C++ 社区开发和维护的、高质量的 C++ 库的集合。
它提供了许多常用而又强大的组件和工具,能够增强 C++ 程序的功能和性能,且具有跨平台的特点。
使用 Boost 可以提高开发效率、降低开发成本,并能够保证程序的高质量和可移植性。
2. Boost 库的一些常用组件有哪些?Boost 库包含了很多常用的组件,以下是其中一些常见的组件:- Smart Pointers: 提供了强大的智能指针类,如 shared_ptr、weak_ptr 等。
- Containers: 包括各种容器类,如array、vector、unordered_map 等。
- Algorithms: 提供了一些常用算法,如排序、查找等。
- Filesystem: 提供了操作文件和目录的类和函数。
- Regex: 支持正则表达式的库。
- Thread: 提供了线程相关的类和函数。
- Test: 提供了单元测试框架,便于测试代码。
- Date Time: 提供了日期和时间处理的类和函数。
3. Boost 中常用的智能指针是什么?请简要介绍其使用方法。
Boost 中最常用的智能指针是shared_ptr。
shared_ptr 是一个模板类,负责管理动态分配的对象,并在没有其他引用时自动释放内存。
使用方法如下:```cppboost::shared_ptr<int> ptr(new int(10));ptr.reset(new int(20));int value = *ptr;```在上述代码中,我们首先创建了一个 shared_ptr 对象 ptr,并将其指向动态分配的 int 对象。
boost常用库的使用介绍 第三讲boost文件系统库
第四节:filesystem::path类
4、path的追加 path& operator/=(const path& p);
template <class Source> path& operator/=(Source const& source);
template <class Source> path& append(Source const& source, const codecvt_type& cvt);
3、path的赋值操作 path& operator=(const path& p); template <class Source> path& operator=(Source const& source); template <class Source> path& assign(Source const& source, const codecvt_type& cvt) template <class InputIterator> path& assign(InputIterator begin, InputIterator end, const codecvt_type& cvt=codecvt());
path();
//构造一个空路径
path(const path& p);
//拷贝构造函数
template <class Source>
path(Source const& source, const codecvt_type& cvt=codecvt()); 码转换
Boost库简单介绍
Boost库简单介绍c++ boost库官⽹官⽹最新版⽂档说明Boost库是⼀个可移植、提供源代码的C++库,作为标准库的后备,是C++标准化进程的开发引擎之⼀,是为C++语⾔标准库提供扩展的⼀些C++程序库的总称。
Boost库由C++标准委员会库⼯作组成员发起,其中有些内容有望成为下⼀代C++标准库内容。
在C++社区中影响甚⼤,是不折不扣的“准”标准库。
Boost由于其对跨平台的强调,对标准C++的强调,与编写平台⽆关。
⼤部分boost库功能的使⽤只需包括相应头⽂件即可,少数(如正则表达式库,⽂件系统库等)需要链接库。
但Boost中也有很多是实验性质的东西,在实际的开发中使⽤需要谨慎。
Boost库由Boost社区组织开发、维护。
其⽬的是为C++程序员提供免费、同⾏审查的、可移植的程序库。
Boost库可以与C++标准库完美共同⼯作,并且为其提供扩展功能。
Boost库使⽤Boost License来授权使⽤。
Boost社区建⽴的初衷之⼀就是为C++的标准化⼯作提供可供参考的实现,Boost社区的发起⼈Dawes本⼈就是C++标准委员会的成员之⼀。
在Boost库的开发中,Boost社区也在这个⽅向上取得了丰硕的成果。
在送审的C++标准库TR1中,有⼗个Boost库成为标准库的候选⽅案。
在更新的TR2中,有更多的Boost库被加⼊到其中。
从某种意义上来讲,Boost库成为具有实践意义的准标准库。
可下载Boost C++ Libraries安装boost库。
⼤部分boost库功能的使⽤只需包括相应头⽂件即可,少数(如正则表达式库,⽂件系统库等)需要链接库。
⾥⾯有许多具有⼯业强度的库,如graph库。
主要分类按照功能分类的Boost库列表按照实现的功能,Boost 可为⼤致归⼊以下20个分类,在下⾯的分类中,有些库同时归⼊⼏种类别。
字符串和⽂本处理a) Conversionb) Formatc) IOStreamd) Lexical Caste) Regexf) Spiritg) String Algoh) Tokenizeri) Wavej) Xpressive容器a) Arrayb) Bimapc) Circular Bufferd) Disjoint Setse) Dynamic Bitsetf) GILg) Graphh) ICLi) Intrusivej) Multi-Arrayk) Multi-Indexl) Pointer Containerm) Property Mapn) Property Treeo) Unorderedp) Variant迭代器a) GILb) Graphc) Iteratorsd) Operatorse) Tokenizer算法b) GILc) Graphd) Min-Maxe) Rangef) String Algog) Utility函数对象和⾼阶编程a) Bindb) Functionc) Functionald) Functional/Factorye) Functional/Forwardf) Functional/Hashg) Lambdah) Member Functioni) Refj) Result Ofk) Signalsl) Signals2m) Utility泛型编程a) Call Traitsb) Concept Checkc) Enable Ifd) Function Typese) GILf) In Place Factory, Typed In Place Factoryg) Operatorsh) Property Mapi) Static Assertj) Type Traits模板元编程a) Function Typesb) Fusionc) MPLd) Protoe) Static Assertf) Type Traits预处理元编程a) Preprocessors并发编程a) Asiob) Interprocessc) MPId) Thread数学和数字a) Accumulatorsb) Integerc) Intervald) Mathe) Math Common Factorf) Math Octoniong) Math Quaternionh) Math/Special Functionsi) Math/Statistical Distributionsk) Numeric Conversionl) Operatorsm) Randomn) Rationalo) uBLAS排错和测试a) Concept Checkb) Static Assertc) Test数据结构a) Anyb) Bitmapc) Compressed Paird) Fusione) ICLf) Multi-Indexg) Pointer Containerh) Property Treei) Tuplej) Uuidk) Variant图像处理a) GIL输⼊输出a) Asiob) Assignc) Formatd) IO State Saverse) IOStreamsf) Program Optionsg) Serialization跨语⾔混合编程a) Python内存管理a) Poolb) Smart Ptrc) Utility解析a) Spirit编程接⼝a) Functionb) Parameter杂项a) Compressed Pairb) Conversionc) CRCd) Date Timee) Exceptionf) Filesystemg) Flyweighti) Meta State Machinej) Numeric Conversionk) Optionall) Polygonm) Program Optionsn) Scope Exito) Statechartp) Swapq) Systemr) Timers) Triboolt) Typeofu) Unitsv) Utilityw) Value Initialized编译器问题的变通⽅案a) Compatibilityb) Config常⽤库Regex正则表达式库SpiritLL parser framework,⽤C++代码直接表达EBNFGraph图组件和算法Lambda在调⽤的地⽅定义短⼩匿名的函数对象,很实⽤的functional功能concept check检查泛型编程中的conceptMpl⽤模板实现的元编程框架Thread可移植的C++多线程库Python把C++类和函数映射到Python之中Pool内存池管理smart_ptr5个学习智能指针必读,⼀份不错的参考是来⾃CUJ的⽂章。
boost的用法
boost的用法Boost是一种非常强大的C++库,它提供了大量的函数,满足C++程序员的日常开发需求。
由于它的优秀的性能和全面的功能,boost已经成为C++开发人员必备的类库之一。
本文将对boost的用法进行详细介绍,帮助C++程序员更好地理解、使用它。
一、boost库的使用方法1.境搭建:首先,开发者需要先在自己的电脑上搭建boost的开发环境,包括安装boost库、boost相关的头文件和库文件。
在Windows平台上使用Visual Studio开发,需要把boost的编译过的头文件和库文件加入到Visual Studio的引用路径中。
2.含头文件:在使用boost库的各种函数和类之前,需要先在程序中引入对应的头文件。
例如,使用boost::filesystem库中的相关函数,需要在程序中加入#include <boost/filesystem.hpp>这行代码,来包含filesystem头文件。
3.接库文件:如果程序中使用到了boost库中的库文件,则需要在工程属性中链接对应的库文件:如果要使用filesystem库,则需要链接boost_filesystem库文件。
4. 代码编写:只要所有的环境设置都完成,就可以正常使用boost库里的各种函数和类了。
例如,可以使用boost::filesystem 库来实现文件系统操作,如创建、删除、拷贝目录或文件等。
二、boost的部分功能Boost提供了大量的函数和类,可以满足各种C++程序员的开发需求。
下面介绍一些常用的功能:1.据类型:Boost提供了很多种类型的容器,可以存储各种数据,如vector、list、deque、map、set等,可以帮助程序员实现数据的快速存取。
2.符串处理:除了提供基本的字符串操作函数,Boost还提供了丰富的字符串处理功能,如字符串分割、比较、查找、替换等。
例如,可以使用boost::algorithm::split函数来对字符串进行分割,其语法简单,容易理解。
boost教程
boost教程标题:boost教程:深入理解 Boost 库,并提供实用示例导语:Boost 是 C++ 社区广泛使用的一个开源库集合,它为 C++ 程序员提供了一系列强大、高效和可移植的工具和组件。
本教程旨在帮助读者深入理解 Boost 库的核心特性,并提供实用示例,使读者能够更好地利用 Boost 提升他们的 C++ 开发能力。
一、Boost 概述(100字)- Boost 是由 C++ 开发者社区合作开发的一个开源库集合,包含了大量的组件和工具,用于增强 C++ 程序的功能和性能。
- Boost 库的代码质量高、文档详尽,使用方便,并且在社区中有广泛的使用和支持。
二、Boost 库的核心特性(200字)1. 智能指针(50字):Boost 提供了多种智能指针类,如shared_ptr、scoped_ptr 和 weak_ptr 等,用于更安全和有效地管理动态内存。
2. 正则表达式(50字):Boost 的正则表达式库提供了强大和灵活的正则表达式功能,支持复杂的模式匹配和替换操作。
3. 线程和并发编程(50字):Boost.Thread 提供了跨平台的线程库,方便开发者实现多线程和并发编程。
4. 容器和算法(50字):Boost 为 C++ 标准库中的容器和算法提供了扩展和增强,如多叉树、堆栈和排序算法等。
5. 文件系统和路径处理(50字):Boost.Filesystem 提供了一组用于处理文件系统和路径的类和函数,使文件和目录的操作更加简单和方便。
三、Boost 应用示例(300字)1. 使用 shared_ptr 管理动态内存(80字):通过实例讲解如何使用 Boost 的 shared_ptr 类来避免内存泄漏和悬空指针等问题。
2. 使用正则表达式进行文本处理(80字):利用 Boost 的正则表达式库,教读者如何进行复杂的模式匹配、提取和替换等操作。
3. 实现多线程抓取网页(80字):利用 Boost.Thread 库,指导读者如何编写一个简单的多线程程序,实现并发抓取网页的功能。
boost遍历文件 原理
boost遍历文件原理Boost是一个C++库集合,它提供了很多用于程序开发的工具和组件。
其中,Boost.Filesystem库提供了对文件系统操作的支持,包括遍历文件。
在使用Boost.Filesystem库遍历文件时,可以使用以下步骤:1. 引入头文件:首先需要引入Boost.Filesystem库的头文件,如下所示:cpp#include <boost/filesystem.hpp>2. 定义路径:定义需要遍历的文件夹路径,可以使用boost::filesystem::path 对象表示路径,如下所示:cppboost::filesystem::path directoryPath("path/to/directory");3. 遍历文件:使用boost::filesystem::directory_iterator对象遍历文件夹中的文件,如下所示:cppfor (boost::filesystem::directory_iterator fileIterator(directoryPath); fileIterator != boost::filesystem::directory_iterator(); ++fileIterator)boost::filesystem::path filePath = *fileIterator;对文件进行操作,如获取文件名、判断是否是文件夹等}在这个循环中,每次迭代会将路径赋值给filePath变量,可以通过这个变量进行文件的操作。
例如,可以通过filePath.filename()获取文件名,通过boost::filesystem::is_directory(filePath)判断是否为文件夹等。
4. 递归遍历子文件夹:如果要递归遍历文件夹及其子文件夹中的所有文件,可以使用boost::filesystem::recursive_directory_iterator对象,如下所示:cppfor (boost::filesystem::recursive_directory_iteratorfileIterator(directoryPath); fileIterator !=boost::filesystem::recursive_directory_iterator(); ++fileIterator){boost::filesystem::path filePath = *fileIterator;对文件进行操作,如获取文件名、判断是否是文件夹等}在这个循环中,与上述的遍历文件夹相比,使用的是boost::filesystem::recursive_directory_iterator对象,它会自动遍历所有子文件夹中的文件。
boost::filesystem文件操作
boost::filesystem文件操作utilFile.h#ifndef RGM_FILEUTILITY_HPP_#define RGM_FILEUTILITY_HPP_#include <boost/filesystem.hpp>namespace RGM{namespace fs = boost::filesystem;/// Utility functions for file managementclass FileUtil{public:/// File separator#if (defined(WIN32) || defined(_WIN32) || defined(WIN64) || defined(_WIN64))static const char FILESEP = '\\';#elsestatic const char FILESEP = '/';#endif/// check if a file or dir existsstatic bool exists(const std::string & input);/// Create dir from input ("D:\a\b\c.ext" or "D:\a\b\", i.e."D:\a\b")static void CreateDir( const std::string& input );/// Get (dir, filebasename, extname) from a full file namestatic std::vector<std::string> FileParts(const std::string& fileName);static std::string GetParentDir(const std::string& filePath);static std::string GetFileExtension(const std::string& filePath);static std::string GetFileBaseName(const std::string& filePath);/// Check if a file already existedstatic bool CheckFileExists(const std::string &fileName);/// Check if a dir existed, if not, create itstatic bool VerifyDirectoryExists(const std::string& directoryName, bool create=true);/// Delete all files under a dirstatic void ClearDirectory(const std::string& directoryName);/// Get all files under a dirstatic void GetFileList(std::vector<std::string>& files,const std::string& path,const std::string& ext, bool useRootDir=false);/// Get current work directorystatic std::string GetCurrentWorkDirectory();/// Add the file separator to filePath if necessarystatic void VerifyTheLastFileSep(std::string&filePath);}; // class FileUtil} // namespace RGM#endif // RGM_FILEUTILITY_HPP_utilFile.cpp#include <boost/foreach.hpp>#include "UtilFile.hpp"namespace RGM{bool FileUtil::exists(const std::string & input){return fs::exists(fs::path(input));}void FileUtil::CreateDir( const std::string& input ) {fs::path p(input.c_str());if (!fs::is_directory(p)) {fs::path pp = p.parent_path();fs::create_directories(pp);}}std::vector<std::string> FileUtil::FileParts(const std::string& fileName)//分离文件名{fs::path p( fileName.c_str() );std::vector<std::string> vstr(3);vstr[0] = p.parent_path().string();vstr[1] = p.stem().string();vstr[2] = p.extension().string();return vstr;}std::string FileUtil::GetParentDir(const std::string& filePath) {return fs::path(filePath.c_str()).parent_path().string();}std::string FileUtil::GetFileExtension(const std::string& filePath){return fs::path(filePath.c_str()).extension().string();}std::string FileUtil::GetFileBaseName(const std::string& filePath){return fs::path(filePath.c_str()).stem().string();}bool FileUtil::CheckFileExists(const std::string& fileName){return fs::exists(fs::path(fileName.c_str()));}bool FileUtil::VerifyDirectoryExists(const std::string& directoryName, bool create){fs::path p(directoryName.c_str());bool exist = fs::exists(p);if (!exist && create) {fs::create_directories(p);}return exist;}void FileUtil::ClearDirectory(const std::string& directoryName){fs::path p(directoryName.c_str());fs::remove_all( p );fs::create_directory( p );}//获取指定目录下所有文件void FileUtil::GetFileList(std::vector<std::string>& files, const std::string& path, const std::string& ext, bool useRootDir) {fs::path targetDir(path.c_str());fs::directory_iterator it(targetDir), eod;bool getAllFiles = (pare("*")==0);BOOST_FOREACH(fs::path const &p, std::make_pair(it, eod)) { if (fs::is_regular_file(p)) {if ( getAllFiles ) {useRootDir ? files.push_back( p.string() ) : files.push_back(p.filename().string());} else {if (pare(p.extension().string())==0) {useRootDir ? files.push_back( p.string() ) : files.push_back(p.filename().string());}}}}}//获取工作目录std::string FileUtil::GetCurrentWorkDirectory(){fs::path p = fs::initial_path();return p.string();}//在文件的结尾加上\\void FileUtil::VerifyTheLastFileSep(std::string &filePath) {if ( filePath.find_last_of("/\\") != (filePath.length() - 1) ) { filePath = filePath + FILESEP;}}} // namespace RGM。
使用boost中的filesystem类库遍历某个目录所有的文件
使用boost中的filesystem类库遍历某个目录所有的文件#include <boost/filesystem/operations.hpp>#include <boost/filesystem/path.hpp>使用boost中的filesystem类库遍历某个目录所有的文件int GetAllFileOfPath(const string strPath){namespace fs = boost::filesystem;// 得到配置文件夹.if ( strPath.size() < 2 ){return 0;}fs::path full_path( fs::initial_path() );full_path = fs::system_complete( fs::path( strPath, fs::native ) );unsigned long file_count = 0;unsigned long dir_count = 0;unsigned long err_count = 0;if ( !fs::exists( full_path ) ){std::cout << "找不到配置文件目录,请检查该目录是否存在:"std::cout << full_path.native_file_string() << std::endl;return -1;}// 遍历配置文件所在的文件夹,得到所有的配置文件名.if ( fs::is_directory( full_path ) ){fs::directory_iterator end_iter;for ( fs::directory_iterator dir_itr( full_path );dir_itr != end_iter;++dir_itr ){try{if ( fs::is_directory( *dir_itr ) ){string strSubDir(full_path.native_directory_string()) ;strSubDir.append("\\");strSubDir.append(dir_itr->leaf());// 如果有子目录,则递归遍历.GetAllFileOfPath(strSubDir);}else{// 先组成包括完整路径的文件名string strFileName(full_path.native_directory_string());strFileName.append("\\");strFileName.append(dir_itr->leaf());fs::path full_file( fs::initial_path() );full_file = fs::system_complete(fs::path(strFileName, fs::native));// 加载解析文件中的信息.//do something;}}catch ( const std::exception & ex ){++err_count;string strMsg = dir_itr->leaf();strMsg.append(",出现错误:");strMsg.append(ex.what());std::cout << strMsg.c_str() << std::endl;}}//<--for()}else // must be a file{string strMsg = full_path.native_file_string();strMsg.append(",不是文件目录.");std::cout << strMsg.c_str() << std::endl;return -1;}return err_count;}。
boost::filesystem经常使用使用方法具体解释
boost::filesystem经常使⽤使⽤⽅法具体解释提⽰:filesystem库提供了两个头⽂件,⼀个是<boost/filesystem.hpp>,这个头⽂件包括基本的库内容。
它提供了对⽂件系统的重要操作。
同⼀时候它定义了⼀个类path。
正如⼤家所想的。
这个是⼀个可移植的路径表⽰⽅法,它是filesystem库的基础。
⼀个是<boost/filesystem/fstream.hpp>。
是对std::fstream的⼀个补充,使⽤能够使⽤类boost::path作为參数。
从⽽使得filesystem库与标准库的关系更亲热。
由于⽂件系统对于⼤多数系统来说都是共享的,所以不同的进程能够同⼀时候操作同⼀个对象,因此filesysetm不提供这⽅⾯的特性保证。
当然这样的保证也是不可能的。
或者⾄少昂贵的。
filesystem在不论什么时候,仅仅要不能完毕对应的任务。
它都可能抛出 basic_filesystem_error异常。
当然并不是总会抛出异常。
由于在库编译的时候能够关闭这个功能。
同⼀时候有两个函数提供了⽆异常版本号。
这是由于在任务不能完毕时并不是是异常。
filesystem库的全部内容定义在boost名字空间的⼀个下级名字空间⾥,它叫boost::filesytem。
在使⽤boost.filesytem之后,链接时须要加“-lboost_filesystem-mt”选项,由于这个须要额外的链接,并不是⼀个纯头⽂件的库。
本⽂中所⽤boost库为1_54#include<boost/filesystem.hpp>{boost::filesystem::path path("/test/test1"); //初始化boost::filesystem::path old_cpath = boost::filesystem::current_path(); //取得当前程序所在⽂件夹boost::filesystem::path parent_path = old_cpath.parent_path();//取old_cpath的上⼀层⽗⽂件夹路径boost::filesystem::path file_path = old_cpath / "file"; //path⽀持重载/运算符if(boost::filesystem::exists(file_path)) //推断⽂件存在性{std::string strPath = file_path.string();int x = 1;}else{//⽂件夹不存在;boost::filesystem::create_directory(file_path); //⽂件夹不存在。
boost--文件、目录操作
boost--⽂件、⽬录操作filesystem库是⽂件系统操作库,可以使⽤其中的basic_path类⽤来操作⽬录、⽂件,使⽤需要包含编译好的system库和filesystem库,我们⼀般不直接使⽤basic_path,⽽是使⽤typedef : path和wpath。
使⽤它需要包含"boost/filesystem.hpp"。
boost::filesystem::path p1("D:\\dir"); //windows下既可使⽤斜杠也可使⽤反斜杠(资源管理器地址栏中使⽤的就是反斜杠),⼜因为在c++中反斜杠是转义字符的标志,所以使⽤反斜杠的话还得再加⼀个反斜杠 boost::filesystem::path p2("D:/dir/data.dat"); //windows下推荐使⽤正斜杠boost::filesystem::path p3("/user/dir"); //linux下使⽤正斜杠boost::filesystem::path p4 = "./dir"; //path的构造函数没有声明为explicit,字符串可以隐式转换为path对象p1 /= "child"; //path重载了 /=,其功能与成员append()相同。
cout << p1 << endl; //⽀持流输出操作,输出为"D:\dir\child"if (p1 == p2); //⽀持⽐较操作auto iter = p1.begin(); //⽀持迭代器来迭代其中的字符串std::string strDir = p1.string(); //获取字符串(构造函数中传⼊的字符串为相对路径的话这⾥也是相对路径)bool bRes = boost::filesystem::portable_posix_name(strDir); //判断是否符合posix⽂件命名规范boost::filesystem::windows_name(strDir); //判断是否符合windows⽂件命名规范boost::filesystem::portable_name(strDir); //相当于portable_posix_name() && windows_nameboost::filesystem::native(strDir); //在windows下相当于windows_name,其它操作系统下只是简单的判断⽂件名不是空格且不含斜杠boost::filesystem::path parentPath = p3.parent_path(); //获得⽗路径boost::filesystem::path parentPath = p3.system_complete(); //获得全路径(绝对路径)std::string name = p2.filename().string(); //⽂件名: data.datstd::string s = p2.stem().string(); //不含扩展名的⽂件名: datastd::string extName = p2.extension().string(); //扩展名: datp1.is_complete(); //是否是⼀个完整的绝对路径p1.relative_path(); //获得path的相对路径boost::filesystem::path p("C:/xxx/yyy");p1.root_path(); //根路径: "C:/"p1.root_name(); //根名字:"C:"p1.root_directory(); //根⽬录: "/"p1.remove_filename(); //删除当前路径中最后的⽂件名p1.replace_extension("hxx"); //改变⽂件扩展名// filesystem使⽤异常来处理⽂件操作时发⽣的错误,所以使⽤的时候应该加上异常处理try{boost::filesystem::file_size(p1); //获得⽂件⼤⼩,⽂件不存在则会抛出异常}catch (boost::filesystem::filesystem_error& e){cout << e.path1() << endl;cout << e.what() << endl;}boost::filesystem::exists(p1); //是否存在boost::filesystem::is_directory(p1); //是否是⽬录boost::filesystem::is_regular_file(p1); //是否是普通⽂件boost::filesystem::is_empty(p1); //⽬录是否为空或⽂件⼤⼩是否为0boost::filesystem::is_symlink(p1); //是否为链接⽂件boost::filesystem::is_other(p1); //当⽂件存在且不是普通⽂件、⽬录或链接⽂件时返回true,其它⽂件类型可以通过⽂件状态类file_status获得boost::filesystem::current_path(); //获得当前路径boost::filesystem::initial_path(); //获得进⼊main函数时的当前路径boost::filesystem::last_write_time(p1); //获得⽂件最后修改时间boost::filesystem::space(p1); //获得路径下磁盘空间分配情况boost::filesystem::remove(p1); //删除⽂件或空⽬录boost::filesystem::remove_all(p1); //删除⽬录boost::filesystem::create_directory(p1); //创建⼀级⽬录boost::filesystem::create_directories(p1); //创建多级⽬录boost::filesystem::copy_file(p1, p2); //拷贝boost::filesystem::rename(p1, p2); //改名void recursive_dir(const boost::filesystem::path& dir){//使⽤directory_iterator递归遍历⽬录boost::filesystem::directory_iterator end; //空的directory_iterator构造函数⽣成⼀个指向end的迭代器boost::filesystem::directory_iterator pos(p1); //传⼊⼀个path对象后可以使⽤++开始迭代操作for (; pos != end; pos++){if (boost::filesystem::is_directory(*pos))recursive_dir(*pos); //directory_iterator迭代器返回的类型其实不是path,但它定义了⼀个到path的类型转换函数,因此这⾥是隐式转换elsecout << *pos << endl; //输出⽂件名}}//directory_iterator不⽀持深度遍历,可以使⽤效率更⾼的recursive_directory_iterator或wrecursive_directory_iteratortypedef boost::filesystem::recursive_directory_iterator rd_iterator;rd_iterator end;rd_iterator pos(p1);for (; pos != end; pos++){//if (boost::filesystem::is_directory(*pos))//pos.no_push(); //退出当前⽬录层次的遍历,相当于使⽤directory_iteratorcout << pos.level() << endl; //获得当前⽬录深度cout << *pos << endl; //输出⽂件名}。
C++使用BOOST操作文件、目录
C++使⽤BOOST操作⽂件、⽬录开始使⽤在BOOST库出现之前,C++对于⽂件和⽬录的操作,⼤都借助于UNIX提供的底层⽂件和⽬录接⼝,从使⽤⾓度来看,这些底层的操作不够友好。
BOOST中filesystem库是⼀种可移植的⽂件系统操作库,可以跨平台的操作⽬录、⽂件等,在不失性能的情况下,提供了友好的操作⽅法。
本⽂主要介绍在UNIX环境中,boost::filesystem的常⽤操作⽅法。
假设你已经安装好了boost库,使⽤boost::filesystem需要加上头⽂件#include <boost/filesystem.hpp>编译时,需要链接-lboost_filesystem当安装路径不是UNIX环境变量中设置的标准路径的话,编译时还需加上boost库头⽂件和动态路路径,即:-I $(BOOST)/include/-L $(BOOST)/lib/变量$(BOOST)是BOOST库实际安装路径。
filesystem介绍filesystem库是⼀个可移植的⽂件系统操作库,它在底层做了⼤量的⼯作,使⽤POSIX标准表⽰⽂件系统的路径,使C++具有了类似脚本语⾔的功能,可以跨平台操作⽬录、⽂件,写出通⽤的脚本程序。
1.path的构造函数可以接受C字符串和string,也可以是⼀个指定⾸末迭代器字符串序列区间。
2.filesystem提供了⼀系列的⽂件名(或⽬录)检查函数。
3.有丰富的函数⽤于获取⽂件名、⽬录名、判断⽂件属性等等。
4.filesystem库使⽤异常来处理⽂件操作时发⽣的错误。
5.filesystem库提供⼀个⽂件状态类file_status及⼀组相关函数,⽤于检查⽂件的各种属性,如是否存在、是否是⽬录、是否是符号链接等。
6.filesystem提供了少量的⽂件属性操作,如windows下的只读、归档等,Linux下的读写权限等。
7.⽂件操作,如创建⽬录、⽂件改名、⽂件删除、⽂件拷贝等等。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
了解 Boost Filesystem LibraryC++语言(实际上是C++标准)的最常见问题之一是,缺乏定义良好的库来帮助处理文件系统查询和操作。
由于这个原因,程序员不得不使用本机操作系统提供的应用程序编程接口(Application Program Interfaces,API),而这使得代码不能在平台之间移植。
以下面的简单情况为例:您需要确定某个文件是否是Directory 类型。
在Microsoft® Windows® 平台中,可以通过调用GetAttributes库函数(在windows.h 头文件中定义)进行此操作:DWORD GetFileAttributes (LPCTSTR lpFileName);对于目录,所得到的结果应该为FILE_ATTRIBUTE_DIRECTORY,而您的代码必须检查是否为此结果。
在UNIX® 和Linux® 平台上,可以通过使用stat或fstat函数及sys/stat.h 中定义的S_ISDIR 宏来实现相同的功能。
您还必须理解stat结构。
下面是对应的代码:#include <sys/stat.h>#include <stdio.h>int main(){struct stat s1;int status = stat(<const char* denoting pathname>, &s1);printf(“Path is a directory : %d\n”, S_ISDIR(s1.st_mode));return 0;}对于I/O 操作较多的程序,这样的不一致就意味着需要进行大量的工程工作才能在平台间移植代码。
正是因为这个原因,我们才引入了Boost Filesystem Library。
这个广泛使用的库提供了安全、可移植且易用的C++接口,用于执行文件系统操作。
可以从Boost站点免费下载此库。
使用boost::filesystem 的第一个程序在深入研究Boost Filesystem Library 的更多细节之前,请看一下清单1中所示的代码;此代码使用Boost API 确定某个文件的类型是否为Directory。
清单1. 用于确定某个文件的类型是否为Directory 的代码#include <stdio.h>#include “boost/filesystem.hpp”int main(){boost::filesystem::path path("/usr/local/include"); // random pathnamebool result = boost::filesystem::is_directory(path);printf(“Path is a directory : %d\n”, result);return 0;}此代码非常明了易懂,您并不需要了解任何系统特定的例程。
此代码经过验证,能在不用修改的情况下在gcc-3.4.4 和cl-13.10.3077 上成功编译。
回页首了解Boost path 对象了解Boost Filesystem Library 的关键是path对象,因为Filesystem Library 中定义的多个例程都要对相应的path对象操作。
文件系统路径通常依赖于操作系统。
例如,众所周知,UNIX 和Linux 系统使用正斜杠( /) 字符作为目录分隔符,而Windows 将反斜杠(\) 字符用于类似的用途。
boost::filesystem::path旨在准确地抽象此特性。
path对象可以通过多种方式进行初始化,最常见的方式是使用char*或std::string进行初始化,如清单2中所示。
清单2. 创建Boost path 对象的方法path(); // empty pathpath(const char* pathname);path(const std::string& pathname);path(const char* pathname, boost::filesystem::path::name_check checker);path(const char* pathname, boost::filesystem::path::name_check checker);在初始化path对象时,可以采用本机格式或可移植操作系统接口(Portable Operating System Interface,POSIX)委员会定义的可移植格式提供PATHNAME 变量。
这两种方法在实际中各有优缺点。
考虑以下情况:您希望操作软件所创建的目录,此目录在UNIX 和Linux 系统上位于/tmp/mywork,而在Windows 上位于C:\tmp\mywork。
可以采用多种方法处理问题。
清单3显示了面向本机格式的方法。
清单3. 使用本机格式初始化path#ifdef UNIXboost::filesystem::path path("/tmp/mywork");#elseboost::filesystem::path path("C:\\tmp\\mywork ");#endif需要单个#ifdef来按操作系统初始化path 对象。
不过,如果您喜欢使用可移植格式,请参见清单4。
清单4. 使用可移植格式初始化pathboost::filesystem::path path("/tmp/mywork");请注意,path::name_check指的是一个名称检查函数原型。
如果其参数输入PATHNAME 对于特定的操作系统或文件系统有效,名称检查函数将返回“True”。
Boost Filesystem Library 提供了多个名称检查函数,而且也欢迎您提供自己的变体。
常用的名称检查函数是Boost 提供的portable_posix_name和windows_name。
回页首path 成员函数概述path对象提供了多个成员方法。
这些成员例程并不会修改文件系统,但会根据path 名称提供有用的信息。
此部分提供了其中几个例程的概述:∙const std::string& string( ):此例程会返回用于初始化path 的字符串的副本,其格式符合path 语法规则。
∙std::string root_directory( ):在提供了路径的情况下,此API 将返回根目录,否则将返回空字符串。
例如,如果路径包含/tmp/var1,则此例程将返回/,即UNIX 文件系统的根。
不过,如果路径是相对路径,如../mywork/bin,此例程将返回空字符串。
∙std::string root_name( ):在给定从文件系统根目录开始的路径的情况下,此例程将返回包含PATHNAME 的第一个字符的字符串。
∙std::string leaf( ):在给定绝对路径名称(例如,/home/user1/file2)的情况下,此例程将提供与文件名称对应的字符串(即file2)。
∙std::string branch_path( ):这是与leaf互补的例程。
在给定路径的情况下,将会返回其构造所用的所有元素(除了最后一个元素)。
例如,对于使用/a/b/c初始化的path,path.branch_path( )将返回/a/b。
对于包含单个元素的路径,如c,此例程将返回空字符串。
∙bool empty( ):如果path 对象包含空字符串(例如path path1("")),则此例程将返回True。
∙boost::filesystem::path::iterator:此例程用于遍历path 的各个元素。
请看清单5所示的代码。
清单5. 使用path::iterator(begin 和end 接口)#include <iostream>#include “boost/filesystem.hpp”int main(){boost::filesystem::path path1("/usr/local/include"); // random pathnameboost::filesystem::path::iterator pathI = path1.begin();while (pathI != path1.end()){std::cout << *pathI << std::endl;++pathI;}return 0;}// result: 1上述程序的输出依次是/、usr、local、include,代表了该目录的层次结构。
∙path operator / (char* lhs, const path& rhs):此例程是path的非成员函数。
它将返回使用lhs和rhs形成的路径的串联值。
它将自动插入/作为路径分隔符,如清单6中所示。
清单6. 路径字符串的串联#include <iostream>#include “boost/filesystem.hpp”int main(){boost::filesystem::path path1("/usr/local/include"); // random pathnameboost::filesystem::path::iterator pathI = path1.begin();while (pathI != path1.end()){std::cout << *pathI << std::endl;++pathI;}return 0;}// result: 1回页首错误处理文件系统操作经常遇到意外的问题,Boost Filesystem Library 将使用C++异常报告运行时错误。
boost::filesystem_error类派生自std::runtime_error类。
库中的函数使用filesystem_error异常报告操作错误。
与不同的可能错误类型对应,Boost 头文件定义了相应的错误代码。
用户代码通常驻留在try...catch块内,使用filesystem_error异常来报告相关错误消息。
清单7提供了重命名文件的小示例,在from路径中的文件不存在时引发异常。
清单7. Boost 中的错误处理#include <iostream>#include “boost/filesystem.hpp”int main(){try {boost::filesystem::path path("C:\\src\\hdbase\\j1");boost::filesystem::path path2("C:\\src\\hdbase\\j2");boost::filesystem::rename(path, path2);}catch(boost::filesystem::filesystem_error e) {// do the needful}return 0;}回页首Boost Filesystem Library 中的函数类别boost::filesystem提供了不同类别的函数:有些函数(如is_directory)用于查询文件系统,而其他函数(如create_directory)则主动对文件系统进行修改。