<menu id="w8yyk"><menu id="w8yyk"></menu></menu>
  • <dd id="w8yyk"><nav id="w8yyk"></nav></dd>
    <menu id="w8yyk"></menu>
    <menu id="w8yyk"><code id="w8yyk"></code></menu>
    <menu id="w8yyk"></menu>
    <xmp id="w8yyk">
    <xmp id="w8yyk"><nav id="w8yyk"></nav>
  • 網站首頁 > 物聯資訊 > 技術分享

    Boost學習之可移植路徑操作--filesystem

    2016-09-28 00:00:00 廣州睿豐德信息科技有限公司 閱讀
    睿豐德科技 專注RFID識別技術和條碼識別技術與管理軟件的集成項目。質量追溯系統、MES系統、金蝶與條碼系統對接、用友與條碼系統對接

    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; 路經中是否包含指定的項

     

    測試代碼:

    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(): \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 迭代器對象,它是唯一一個用于結束條件的合法迭代器。

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

    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.     }
    RFID管理系統集成商 RFID中間件 條碼系統中間層 物聯網軟件集成
    最近免费观看高清韩国日本大全