Boost学习之可移植路径操作--filesystem
Boost.Filesystem 库为对路径、文件和目录进行查询和操作提供了可移植的工具,已经被C++标准委员会接纳包含到TR2中。
编译
使用Boost.Filesystem 库之前要先编译它,请参考《Boost的编译》
头文件
#include <boost/filesystem.hpp>
所有Boost.Filesystem库的内容都处于名空间boost::filesystem之内。
认识basic_path类
在Boost.Filesystem库里basic_path是最重要的类,它以系统无关的方式保存路径、文件名。象std::basic_string 一样,针对char和wchar_t,分别特化了path和wpath。
basic_path的构造函数:
basic_path( const string_type & s );
basic_path( const value_type * s );
template <class InputIterator> basic_path(InputIterator s, InputIterator last);
输入参数是一个字符串(或字符迭代器),表示路径名,可以输入系统原生路径名或可移植路径名
原生路径名没啥好说的,比如C:\Windows; D:\abc\ttt.txt等
可移植路径名的定义和Unix的路径定义相同,以“/”作为路径分隔符。
basic_path成员函数:
成员函数 | 作用 |
---|---|
template <class InputIterator>basic_path& append(InputIterator first, InputIterator last); | 将字符串 s 或字符序列 [first,last) 中的路径元素追加到保存的路径中。 |
basic_path& remove_filename(); | 去除路径中的文件名 |
basic_path& replace_extension( const string_type & new_extension = "" ); | 替换扩展名 |
string_type string() | 得到可移植路径名 |
string_type file_string() | 得到系统原生文件名 |
string_type directory_string() | 得到系统原生路径名 |
string_type root_name() const; | 得到根名 |
string_type root_directory() const; | 得到根目录 |
basic_path root_path() const; | 得到根路径:根名+根目录 |
basic_path relative_path() const; | 得到相对路径 |
string_type filename() const; | 得到文件名 |
basic_path parent_path() const; | 得到父路径:根路径+相对路径 |
string_type stem(const Path & p) const; | 得到不带扩展名的文件名 |
string_type extension(const Path & p) const; | 得到扩展名 |
bool empty() const; | path未赋值 |
bool is_complete() const; | 是否是完整路径 |
bool has_root_path() const; bool has_root_name() const; bool has_root_directory() const; bool has_relative_path() const; bool has_filename() const; bool has_branch_path() const; |
路经中是否包含指定的项 |
测试代码:
- #include "boost/filesystem.hpp" // 包含所有需要的 Boost.Filesystem 声明
- #include <iostream> // 使用 std::cout
- namespace fs = boost::filesystem;
- // 宏FSTEST:测试f的成员函数,输出成员函数名和结果
- #define FSTEST(x) std::cout << #x##": " << f.x << std::endl
- int main()
- {
- fs::path f("\\folder1\\folder2\\folder3\\filename.ext");
- FSTEST(string());
- FSTEST(file_string());
- FSTEST(directory_string());
- FSTEST(root_name());
- FSTEST(root_directory());
- FSTEST(root_path());
- FSTEST(relative_path());
- FSTEST(filename());
- FSTEST(parent_path());
- FSTEST(stem());
- FSTEST(extension());
- FSTEST(replace_extension("new"));
- char buf[]="hello";
- FSTEST(append(buf, buf+sizeof(buf)));
- FSTEST(remove_filename());
- return 0;
- }
输出:
string(): /folder1/folder2/folder3/filename.ext
file_string(): \folder1\folder2\folder3\filename.ext
directory_string(): \folder1\folder2\folder3\filename.ext
root_name():
root_directory(): /
root_path(): /
relative_path(): folder1/folder2/folder3/filename.ext
filename(): filename.ext
parent_path(): /folder1/folder2/folder3
stem(): filename
extension(): .ext
replace_extension("new"): /folder1/folder2/folder3/filename.new
append(buf, buf+sizeof(buf)): /folder1/folder2/folder3/filename.new/hello
remove_filename(): /folder1/folder2/folder3/filename.new/
常用函数
函数名 | 作用 |
---|---|
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); | 返回路径名对应的状态 |
template <class Path> const Path& initial_path(); | 得到程序运行时的系统当前路径 |
template <class Path> Path current_path(); | 得到系统当前路径 |
template <class Path> void current_path(const Path& p); | 改变当前路径 |
template <class Path> space_info space(const Path& p); | 得到指定路径下的空间信息,space_info 有capacity, free 和 available三个成员变量,分别表示容量,剩余空间和可用空间。 |
template <class Path> std::time_t last_write_time(const Path& p); | 最后修改时间 |
template <class Path> void last_write_time(const Path& p, const std::time_t new_time); | 修改最后修改时间 |
template <class Path> bool create_directory(const Path& dp); | 建立路径 |
template <class Path1, class Path2> void create_hard_link(const Path1& to_p, const Path2& from_p); template <class Path1, class Path2> error_code create_hard_link(const Path1& to_p, const Path2& from_p, error_code& ec); |
建立硬链接 |
template <class Path1, class Path2> void create_symlink(const Path1& to_p, const Path2& from_p); template <class Path1, class Path2> error_code create_symlink(const Path1& to_p, const Path2& from_p, error_code& ec); |
建立软链接 |
template <class Path> void remove(const Path& p, system::error_code & ec = singular ); | 删除文件 |
template <class Path> unsigned long remove_all(const Path& p); | 递归删除p中所有内容,返回删除文件的数量 |
template <class Path1, class Path2> void rename(const Path1& from_p, const Path2& to_p); | 重命名 |
template <class Path1, class Path2> void copy_file(const Path1& from_fp, const Path2& to_fp); | 拷贝文件 |
template <class Path> Path complete(const Path& p, const Path& base=initial_path<Path>()); | 以base以基,p作为相对路径,返回其完整路径 |
template <class Path> bool create_directories(const Path & p); | 建立路径 |
路径迭代器
basic_directory_iterator
构造函数:
explicit basic_directory_iterator(const Path& dp);
basic_directory_iterator();
basic_directory_iterator
从构造参数得到目录,每一次调用 operator++
,它就查找并得到下一个文件名直到目录元素的末尾。不带参数的构造函数 basic_directory_iterator()
总是构造一个 end 迭代器对象,它是唯一一个用于结束条件的合法迭代器。
示例代码,得到指定目录下的所有文件名:
- void find_file( const fs::path & dir_path )
- {
- if ( !fs::exists( dir_path ) ) return;
- fs::directory_iterator end_itr; // 缺省构造生成一个结束迭代器
- for ( fs::directory_iterator itr( dir_path );
- itr != end_itr;
- ++itr )
- {
- if ( fs::is_directory(itr->status()) )
- {
- find_file( itr->path() ); //递归查找
- }
- else
- {
- std::cout << *itr << std::endl;
- }
- }
- }
basic_recursive_directory_iterator
递归遍历目录的迭代器,它的构造参数与basic_directory_iterator相同,当调用 operator++
时,如果当前值是一个目录,则进入下一级目录。
它有三个成员函数:
函数名 | 作用 |
---|---|
int level() const; | 得到当前搜索深度 |
void pop(); | 调用pop()后,下一次递增就会直接返回上一级目录 |
void no_push(); | 调用no_push()后,即便下一个元素是目录类型也不进入 |
示例代码,得到指定目录下的所有文件名(和上例作用相同):
- void find_file2( const fs::path & dir_path )
- {
- fs::recursive_directory_iterator end_itr; // 缺省构造生成一个结束迭代器
- for ( fs::recursive_directory_iterator itr( dir_path );
- itr != end_itr;
- ++itr )
- {
- std::cout << itr.level() << *itr << std::endl;
- }
- }
Boost学习之可移植路径操作--filesystem的更多相关文章
- Windows路径操作API函数学习
前言 在VC++开发过程中,经常需要用到一些路径操作,比如拼需要的文件路径,搜索路径中的内容等等.Windows提供了一套关于路径操作的API帮助我们更好的执行这些操作. 路径截断与合并API Pat ...
- Windows路径操作API函数学习【转载】
文章出自https://www.cnblogs.com/MakeView660/p/6644838.html 前言 在VC++开发过程中,经常需要用到一些路径操作,比如拼需要的文件路径,搜索路径中的内 ...
- BOOST学习笔记
BOOST学习笔记 1 tool #pragma once #include <vector> #include "boost/noncopyable.hpp" #in ...
- Boost学习总结(一)VS2010环境下编译STLport和Boost
Boost学习总结(一)VS2010环境下编译STLport和Boost Boost简介 Boost库是一个功能强大.构造精巧.跨平台.开源并且完全免费的C++程序库.1998年,Beman G.Da ...
- tensorflow学习笔记——使用TensorFlow操作MNIST数据(2)
tensorflow学习笔记——使用TensorFlow操作MNIST数据(1) 一:神经网络知识点整理 1.1,多层:使用多层权重,例如多层全连接方式 以下定义了三个隐藏层的全连接方式的神经网络样例 ...
- Xamarin Essentials教程获取路径文件系统FileSystem
Xamarin Essentials教程获取路径文件系统FileSystem 文件系统用于管理设备内的各类文件.通过文件系统,应用程序可以创建永久文件和临时文件,也可以获取预先打包的文件,如预设数据库 ...
- boost 学习笔记 0: 安装环境
boost 学习笔记 0: 安装环境 最完整的教程 http://einverne.github.io/post/2015/12/boost-learning-note-0.html Linux 自动 ...
- Emacs学习心得之 基础操作
作者:枫雪庭 出处:http://www.cnblogs.com/FengXueTing-px/ 欢迎转载 Emacs学习心得之 基础操作 1.前言与学习计划2.Emacs基础操作 一. 前言与学习计 ...
- 【代码笔记】iOS-缓存路径操作类
一,代码. AppDelegate.h #import <UIKit/UIKit.h> @interface AppDelegate : UIResponder <UIApplica ...
随机推荐
- Android中使用NDK
首先用Android Studio下载NDK 这个比较简单,就不多说了 1.写调用jni的Java代码 新建一个JniUtils类 public class JniUtils { static { S ...
- 大数据计算:如何仅用1.5KB内存为十亿对象计数
大数据计算:如何仅用1.5KB内存为十亿对象计数 Big Data Counting: How To Count A Billion Distinct Objects Using Only 1.5K ...
- Java 如何判断一个字符是否是数字或字母
在C++中, 可以用isdigit()判断一个字符是否是数字,可以用isalpha()判断一个字符是否是字母,还有很多,都在<cctype>头文件中 而类似的方法在JAVA中,则主要是Ch ...
- java学习之网络编程之echo程序
服务端的实现 package com.gh.echo; import java.io.*; import java.net.*; /** * echo服务器程序 * 实现 不断接收字符串 ,然后返回一 ...
- Handler总结
一.整体工程图 二.activity_handler.xml <?xml version="1.0" encoding="utf-8"?> < ...
- 【Hibernate】Illegal attempt to associate a collection with two open sessions
今天在用Hibernate对对象进行修改操作的时候报了这个错. 之前一直没什么错误,但是今天修改了一下表结构,增加了一个OneToMany的映射. 所以在我获取对象,重新set一个变量之后就报了这个错 ...
- 已经上架的app(可供销售)在AppStore上搜不到的解决办法
这两天很是头大, 因为3天前手动发布的app到现在都还没在AppStore上看到,打了无数电话给苹果和发邮件给review团队. 下面说说怎么解决我们在iTunes后台看到是绿灯(可供销售)但是就是在 ...
- iOS转场动画
文顶顶 最怕你一生碌碌无为 还安慰自己平凡可贵 iOS开发UI篇—核心动画(转场动画和组动画) iOS开发UI篇—核心动画(转场动画和组动画) 一.转场动画简单介绍 CAAnimation的子类,用于 ...
- BZOJ 1270: [BeijingWc2008]雷涛的小猫( dp )
简单的dp.. dp(i,j) = max(dp(x,y))+cnt[i][j], (x,y)->(i,j)是合法路径. 设f(i)= max(dp(x,y))(1≤x≤N, 1≤y≤i), g ...
- oracle11g dataguard 完全手册(转)
转自:http://www.cnblogs.com/tippoint/archive/2013/04/18/3029019.html 一.前言: 网络上关于dataguard的配置文章很多,但是很 ...