兔子的技术博客

兔子

   :: 首页 :: 联系 :: 聚合  :: 管理
  202 Posts :: 0 Stories :: 43 Comments :: 0 Trackbacks

留言簿(10)

最新评论

阅读排行榜

评论排行榜

Boost--filesystem

头文件
#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; 
}


转自:http://hi.baidu.com/dulamhoo/blog/item/c501e83a48c2bcf4838b1380.html

posted on 2010-12-29 13:42 会飞的兔子 阅读(1914) 评论(0)  编辑 收藏 引用 所属分类: C++库,组件

只有注册用户登录后才能发表评论。
网站导航: 博客园   IT新闻   BlogJava   知识库   博问   管理