boost--文件、目录操作
生活随笔
收集整理的這篇文章主要介紹了
boost--文件、目录操作
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
filesystem庫是文件系統操作庫,可以使用其中的basic_path類用來操作目錄、文件,使用需要包含編譯好的system庫和filesystem庫,我們一般不直接使用basic_path,而是使用typedef : path和wpath。?使用它需要包含"boost/filesystem.hpp"。
?
boost::filesystem::path p1("D:\\dir"); //windows下既可使用斜杠也可使用反斜杠(資源管理器地址欄中使用的就是反斜杠),又因為在c++中反斜杠是轉義字符的標志,所以使用反斜杠的話還得再加一個反斜杠boost::filesystem::path p2("D:/dir/data.dat"); //windows下推薦使用正斜杠boost::filesystem::path p3("/user/dir"); //linux下使用正斜杠boost::filesystem::path p4 = "./dir"; //path的構造函數沒有聲明為explicit,字符串可以隱式轉換為path對象p1 /= "child"; //path重載了 /=,其功能與成員append()相同。cout << p1 << endl; //支持流輸出操作,輸出為"D:\dir\child"if (p1 == p2); //支持比較操作auto iter = p1.begin(); //支持迭代器來迭代其中的字符串std::string strDir = p1.string(); //獲取字符串(構造函數中傳入的字符串為相對路徑的話這里也是相對路徑)bool bRes = boost::filesystem::portable_posix_name(strDir); //判斷是否符合posix文件命名規范boost::filesystem::windows_name(strDir); //判斷是否符合windows文件命名規范boost::filesystem::portable_name(strDir); //相當于portable_posix_name() && windows_nameboost::filesystem::native(strDir); //在windows下相當于windows_name,其它操作系統下只是簡單的判斷文件名不是空格且不含斜杠boost::filesystem::path parentPath = p3.parent_path(); //獲得父路徑boost::filesystem::path parentPath = p3.system_complete(); //獲得全路徑(絕對路徑)std::string name = p2.filename().string(); //文件名: data.datstd::string s = p2.stem().string(); //不含擴展名的文件名: datastd::string extName = p2.extension().string(); //擴展名: datp1.is_complete(); //是否是一個完整的絕對路徑p1.relative_path(); //獲得path的相對路徑boost::filesystem::path p("C:/xxx/yyy");p1.root_path(); //根路徑: "C:/"p1.root_name(); //根名字:"C:"p1.root_directory(); //根目錄: "/"p1.remove_filename(); //刪除當前路徑中最后的文件名p1.replace_extension("hxx"); //改變文件擴展名// filesystem使用異常來處理文件操作時發生的錯誤,所以使用的時候應該加上異常處理try{boost::filesystem::file_size(p1); //獲得文件大小,文件不存在則會拋出異常}catch (boost::filesystem::filesystem_error& e){cout << e.path1() << endl;cout << e.what() << endl;}boost::filesystem::exists(p1); //是否存在boost::filesystem::is_directory(p1); //是否是目錄boost::filesystem::is_regular_file(p1); //是否是普通文件boost::filesystem::is_empty(p1); //目錄是否為空或文件大小是否為0boost::filesystem::is_symlink(p1); //是否為鏈接文件boost::filesystem::is_other(p1); //當文件存在且不是普通文件、目錄或鏈接文件時返回true,其它文件類型可以通過文件狀態類file_status獲得boost::filesystem::current_path(); //獲得當前路徑boost::filesystem::initial_path(); //獲得進入main函數時的當前路徑boost::filesystem::last_write_time(p1); //獲得文件最后修改時間boost::filesystem::space(p1); //獲得路徑下磁盤空間分配情況boost::filesystem::remove(p1); //刪除文件或空目錄boost::filesystem::remove_all(p1); //刪除目錄boost::filesystem::create_directory(p1); //創建一級目錄boost::filesystem::create_directories(p1); //創建多級目錄boost::filesystem::copy_file(p1, p2); //拷貝boost::filesystem::rename(p1, p2); //改名void recursive_dir(const boost::filesystem::path& dir){//使用directory_iterator遞歸遍歷目錄boost::filesystem::directory_iterator end; //空的directory_iterator構造函數生成一個指向end的迭代器boost::filesystem::directory_iterator pos(p1); //傳入一個path對象后可以使用++開始迭代操作for (; pos != end; pos++){if (boost::filesystem::is_directory(*pos))recursive_dir(*pos); //directory_iterator迭代器返回的類型其實不是path,但它定義了一個到path的類型轉換函數,因此這里是隱式轉換elsecout << *pos << endl; //輸出文件名}}//directory_iterator不支持深度遍歷,可以使用效率更高的recursive_directory_iterator或wrecursive_directory_iteratortypedef boost::filesystem::recursive_directory_iterator rd_iterator;rd_iterator end;rd_iterator pos(p1);for (; pos != end; pos++){//if (boost::filesystem::is_directory(*pos))//pos.no_push(); //退出當前目錄層次的遍歷,相當于使用directory_iteratorcout << pos.level() << endl; //獲得當前目錄深度cout << *pos << endl; //輸出文件名}
?
總結
以上是生活随笔為你收集整理的boost--文件、目录操作的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Paper1:HoPE: Horizon
- 下一篇: 读自动驾驶激光雷达物体检测技术(Lida