• 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 tt.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;
    路经中是否包含指定的项

    测试代码:

    1. #include "boost/filesystem.hpp"   // 包含所有需要的 Boost.Filesystem 声明
    2. #include <iostream>               // 使用 std::cout
    3. namespace fs = boost::filesystem;
    4. // 宏FSTEST:测试f的成员函数,输出成员函数名和结果
    5. #define FSTEST(x) std::cout << #x##": " << f.x << std::endl
    6. int main()
    7. {
    8.     fs::path f("\folder1\folder2\folder3\filename.ext");
    9.  
    10.     FSTEST(string());
    11.     FSTEST(file_string());
    12.     FSTEST(directory_string());
    13.     FSTEST(root_name());
    14.     FSTEST(root_directory());
    15.     FSTEST(root_path());
    16.     FSTEST(relative_path());
    17.     FSTEST(filename());
    18.     FSTEST(parent_path());
    19.     FSTEST(stem());
    20.     FSTEST(extension());
    21.  
    22.     FSTEST(replace_extension("new"));
    23.     char buf[]="hello";
    24.     FSTEST(append(buf, buf+sizeof(buf)));
    25.     FSTEST(remove_filename());
    26.  
    27.     return 0;
    28. }

    输出:

    string(): /folder1/folder2/folder3/filename.ext 
    file_string(): folder1folder2folder3filename.ext
    directory_string(): folder1folder2folder3filename.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 迭代器对象,它是唯一一个用于结束条件的合法迭代器。

    示例代码,得到指定目录下的所有文件名:

    1. void find_file( const fs::path & dir_path )
    2. {
    3.     if ( !fs::exists( dir_path ) ) return;
    4.     fs::directory_iterator end_itr; // 缺省构造生成一个结束迭代器
    5.     for ( fs::directory_iterator itr( dir_path );
    6.         itr != end_itr;
    7.         ++itr )
    8.     {
    9.         if ( fs::is_directory(itr->status()) )
    10.         {
    11.             find_file( itr->path() ); //递归查找
    12.         }
    13.         else
    14.         {
    15.             std::cout << *itr << std::endl;
    16.         }
    17.   }
    18. }

    basic_recursive_directory_iterator

    递归遍历目录的迭代器,它的构造参数与basic_directory_iterator相同,当调用 operator++时,如果当前值是一个目录,则进入下一级目录。
    它有三个成员函数:

    函数名作用
    int level() const; 得到当前搜索深度
    void pop(); 调用pop()后,下一次递增就会直接返回上一级目录
    void no_push(); 调用no_push()后,即便下一个元素是目录类型也不进入


    示例代码,得到指定目录下的所有文件名(和上例作用相同):

    1. void find_file2( const fs::path & dir_path )
    2. {
    3.     fs::recursive_directory_iterator end_itr; // 缺省构造生成一个结束迭代器
    4.     for ( fs::recursive_directory_iterator itr( dir_path );
    5.         itr != end_itr;
    6.         ++itr )
    7.     {
    8.         std::cout << itr.level() << *itr << std::endl;
    9.     }
  • 相关阅读:
    面试C#需要准备的一些基础
    学习jQuery(一),做的第一个可拖动列的Grid
    面试的两道SQL题
    SSIS ODBC方式连接mysql数据库的一个问题
    WIN7下A卡解决部分游戏(CS、CF等)无法全屏问题
    显示Deprecated: Assigning the return value of new by reference is deprecated in解决办法
    Eclipse 中文插件的安装
    安装NASM for Linux
    将Eclipse中文注释字体变大方法
    如何查看局域网内所有IP
  • 原文地址:https://www.cnblogs.com/lidabo/p/3955717.html
Copyright © 2020-2023  润新知