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.文件操作,如创建目录、文件改名、文件删除、文件拷贝等等。
8.basic_directory_iterator提供了迭代一个目录下所有文件的功能。
path类的基本用法
//注意 /= 和 += 的区别, /= 表示追加下级目录, += 仅仅是字符串的串接
path dir("C:\\Windows");
dir /= "System32"; //追加下级目录
dir /= "services.exe";
std::cout << dir << std::endl;
std::cout << dir.string() << std::endl; //转换成std::string 类型
std::cout << dir.root_name()<< std::endl; //盘符名:C:
std::cout << dir.root_directory()<< std::endl; //根目录:"\"
std::cout << dir.root_path()<< std::endl; //根路径:"C:\"
std::cout << dir.relative_path()<< std::endl; // 相对路径:Windows\System32\services.exe
std::cout << dir.parent_path()<< std::endl; //上级目录:C:\Windows\System32
std::cout << dir.filename()<< std::endl; //文件名:services.exe
std::cout << dir.stem()<< std::endl; //不带扩展的文件名:services
std::cout << dir.extension()<< std::endl; //扩展名:.exe
常用函数及异常处理
system_complete(path);// 返回完整路径(相对路径+当前路径)
exists(path);// 目录是否存在
is_directory(path);//
is_directory(file_status);// 是否是路径
is_regular_file(path);//
is_regular_file(file_status);// 是否是普通文件
is_symlink(path);//
is_symlink(file_status);// 是否是一个链接文件
file_status status(path);// 返回路径名对应的状态
initial_path();// 得到程序运行时的系统当前路径
current_path();// 得到系统当前路径
current_path(const Path& p);// 改变当前路径
space_info space(const Path& p);// 得到指定路径下的空间信息,space_info 有capacity, free 和 available三个成员变量,分别表示容量,剩余空间和可用空间。
last_write_time(const Path& p);// 最后修改时间
last_write_time(const Path& p, const std::time_t new_time);// 修改最后修改时间
bool create_directory(const Path& dp);// 建立路径
create_hard_link(const Path1& to_p, const Path2& from_p);//
error_code create_hard_link(const Path1& to_p, const Path2& from_p, error_code& ec);// 建立硬链接
create_symlink(const Path1& to_p, const Path2& from_p);//
create_symlink(const Path1& to_p, const Path2& from_p, error_code& ec);// 建立软链接
remove(const Path& p, system::error_code & ec = singular );// 删除文件
remove_all(const Path& p);// 递归删除p中所有内容,返回删除文件的数量
rename(const Path1& from_p, const Path2& to_p);// 重命名
copy_file(const Path1& from_fp, const Path2& to_fp);// 拷贝文件
omplete(const Path& p, const Path& base=initial_path<Path>());// 以base以基,p作为相对路径,返回其完整路径
create_directories(const Path & p);// 建立路径
实例
路径(path类)和迭代器–filesystem操作的基础
path类提供了路径操作的丰富接口,可以获得文件名、拓展名、文件属性等。迭代器提供了遍历整个目录所有文件的功能,常用的filesystem库的迭代器是:directory_iterator和recursive_directory_iterator,后者相对于前者提供了递归遍历的功能。
基于路径和迭代器,下文已迭代目录(cur/)为例,简介filesystem的基本操作:
首先,定义要处理文件的路径
string curPath = “/home/test/cur/” ;
条件假设:
1).cur目录下结构如下
cur/
—build.sh
—src/
——main.cpp
——makefile
2).进入/home/test/cur目录,执行build.sh编译程序后,留在当前目录执行可执行文件
3).假设程序扫描目录时,首先扫描到的文件时 build.sh
//定义一个可以递归的目录迭代器,用于遍历
boost::filesystem::recursive_directory_iterator itEnd;
for(boost::filesystem::recursive_directory_iterator itor( curPath.c_str() ); itor != itEnd ;++itor)
{
//itor->path().string()是目录下文件的路径
/*
*当curPath是相对路径时,itor->string()也是相对路径
*即当curPath = "../cur/",下面将输出"../cur/build.sh"
*/
//当curPath是绝对路径时,itor->string()也是绝对路径
string file = itor->path().string() ; // "/home/test/cur/build.sh" //构造文件路径,以获得文件丰富的操作
//path可以接受C风格字符串和string类型作为构造函数的参数,而提供的路径可以是相对路径,也可以是绝对路径。
boost::filesystem::path filePath(file);
//path的方法如filename()等,返回的对象仍是path,如果可以通过path的string()方法,获取对象的string类型
//parent_path()获得的是当前文件的父路径
cout<<filePath.parent_path()<<endl; // "/home/test/cur/" //filename()获得的是文件名,含拓展名
cout<<filePath.filename()<<endl; // "build.sh"
cout<<filePath.filename().string()<<endl; //stem()获得的是文件的净文件名,即不含拓展名
cout<<filePath.stem()<<endl; // "build" //extension()文件的拓展名(主要是".sh"而不是"sh")
cout<<filePath.extension()<<endl; // ".sh" //获得文件的大小,单位为字节
int nFileSize = boost::filesystem::file_size(filePath); //最后一次修改文件的时间
//last_write_time()返回的是最后一次文件修改的绝对秒数
//last_write_time(filePath,time(NULL))还可以修改文件的最后修改时间,相当于Linux中命令的touch
if(filePath.last_write_time() - time(NULL) > )
{
/*
*在工程实践中,当需要不断的扫目录,而目录又会不断的加入新文件时,
*借助last_write_time()可以判断新入文件的完整性,以避免错误的处理还未写完的文件
*/
} //判断文件的状态信息
if(boost::filesystem::is_regular_file(file))
{
//is_regular_file(file)普通文件
//is_directory(file)目录文件,如当遍历到"/home/test/cur/src/"时,这就是一个目录文件
//is_symlink(file)链接文件
...
} //更改拓展名
boost::filesystem::path tmpPath = filePath;
//假设遍历到了cpp文件,想看下对应的.o文件是否存在
tmpPath.replace_extension(".o");
//判断文件是否存在
if( boost::filesystem::exists( tmpPath.string() ) ) //删除文件
//remove只能删除普通文件,而不能删除目录
boost::filesystem::remove(tmpPath.string());
//remove_all则提供了递归删除的功能,可以删除目录
boost::filesystem::remove_all(tmpPath.string()); //移动文件 & 拷贝文件
//srcPath原路径,srcPath的类型为string
//destPath目标路径,destPath的类型为string
boost::filesystem::rename(srcPath , destPath);
boost::filesystem::copy_file(srcPath , destPath);
//拷贝目录
boost::filesystem::copy_files("/home/test","/dev/shm") } boost::filesystem还可以创建目录:
if( !boost::filesystem::exists( strFilePath ) )
{
boost::filesystem::create_directories(strFilePath)
}
boost::filesystem提供的操作当然不只如此,详见参考文件1。使用boost::filesystem操作时加上异常捕获,也能够增加代码的鲁棒性,在此不进行累述。
C++使用BOOST操作文件、目录的更多相关文章
- python学习笔记:模块——os模块(操作文件/目录)
import os os.rename(old,new) #重命名文件或目录 os.remove(f)#删除文件 os.mkdir('china/beijing') #创建文件夹 os.makedir ...
- Python - os 文件/目录操作
最近经常用到 os 操作文件/目录,感觉挺好使的,但是一直没有系统的梳理学习一下, 今天想借此机会整理一下工作中常用的方法,也算自己总结学习的一个积累吧. 直接上代码,注释明了 #-*-coding: ...
- 【Python】[IO编程]文件读写,StringIO和BytesIO,操作文件和目录,序列化
IO在计算机中指Input/Output,也就是输入和输出. 1.文件读写,1,读文件[使用Python内置函数,open,传入文件名标示符] >>> f = open('/User ...
- C#路径/文件/目录/I/O常见操作汇总
文件操作是程序中非常基础和重要的内容,而路径.文件.目录以及I/O都是在进行文件操作时的常见主题,这里想把这些常见的问题作个总结,对于每个问题,尽量提供一些解决方案,即使没有你想要的答案,也希望能提供 ...
- C#路径/文件/目录/I/O常见操作汇总<转载>
文件操作是程序中非常基础和重要的内容,而路径.文件.目录以及I/O都是在进行文件操作时的常见主题,这里想把这些常见的问题作个总结,对于每个问题,尽量提供一些解决方案,即使没有你想要的答案,也希望能提供 ...
- 【转】C#路径/文件/目录/I/O常见操作汇总
文件操作是程序中非常基础和重要的内容,而路径.文件.目录以及I/O都是在进行文件操作时的常见主题,这里想把这些常见的问题作个总结,对于每个问题,尽量提供一些解决方案,即使没有你想要的答案,也希望能提供 ...
- C#路径,文件,目录,I/O常见操作
C#路径,文件,目录,I/O常见操作 文件操作是程序中非常基础和重要的内容,而路径.文件.目录以及I/O都是在进行文件操作时的常见主题,这里想把这些常见的问题作个总结,对于每个问题,尽量提供 ...
- Python操作文件和目录
Python操作文件和目录 读写文件比较简单,有一点特别注意就好了 windows下Python默认打开的文件以gbk解码,而一般我们的文件是utf-8编码的,所以如果文本含有中文,就会出现异常或者乱 ...
- Python之IO编程——文件读写、StringIO/BytesIO、操作文件和目录、序列化
IO编程 IO在计算机中指Input/Output,也就是输入和输出.由于程序和运行时数据是在内存中驻留,由CPU这个超快的计算核心来执行,涉及到数据交换的地方,通常是磁盘.网络等,就需要IO接口.从 ...
随机推荐
- css3毛玻璃效果白边问题
注:css3毛玻璃效果应该很多人都知道怎么实现,但是有个问题是图片模糊了之后相当于缩小了,所以颜色深的图片会出现白边,这里说下我参考网上的解决方式吧! 1.毛玻璃实现方法: CSS3 blur滤镜实现 ...
- MySQL事务实现原理
MySQL事务隔离级别的实现原理 知识储备 只有InnoDB支持事务,所以这里说的事务隔离级别是指InnoDB下的事务隔离级别 隔离级别 读未提交:一个事务可以读取到另一个事务未提交的修改.这会带来脏 ...
- 【转】C++和Java比较
"作为一名C++程序员,我们早已掌握了面向对象程序设计的基本概念,而且Java的语法无疑是非常熟悉的.事实上,Java本来就是从C++衍生出来的." 然而,C++和Java之间仍存 ...
- Golang教程:类型
下面是 Go 支持的基本类型: bool Numeric Types int8, int16, int32, int64, int uint8,uint16,uin32,uint64, uint f ...
- java中多线程中测试某个条件的变化用 if 还是用 while?
最近在研究wait和notify方法,发现有个地方要注意,但是网上又说得不是很明白的地方,就是经典的生产者和消费模式,使用wait和notify实现,判断list是否为空的这个为什么要用while而不 ...
- 实现 如 goole closure 类似功能模块加载函数
看过goole closure 的同学都知道 其中定义一个类名函数时候只要 inlude("") 想加载某个模块只要require("")就可以利用: ...
- C# dynamic json
对应普通对象,写个扩展方法,ToJson蛮方便. 但是 dynamic 类型就不行了,因为是运行时解析,只能转换为强类型 IDictionary<string, object> 才可以. ...
- WPF中使用ObjectDataProvider绑定方法
ObjectDataProvider提供了绑定任意.net类型的功能,具体功能如下: 1.ObjectDataProvider提供了绑定任意CLR类型的公嫩那个. 2.它可以再XAML中利用生命史的语 ...
- 送专利啦~~ .Net高阶异常处理之TopLevelEH
我们知道,.Net的应用程序运行在.net framework虚拟机上,对于在运行时发生的错误,我们有try...catch可以捕捉,实在不济,对于winform和asp.net 我们都有全局的事件可 ...
- Filter的常见应用
1.字符编码过滤器 实现功能,在a.jsp中填写用户名提交到b.jsp,在b.jsp中读取参数名. a.jsp <body> <form action="encoding/ ...