filesystem庫是文件系統操做庫,可使用其中的basic_path類用來操做目錄、文件,使用須要包含編譯好的system庫和filesystem庫,咱們通常不直接使用basic_path,而是使用typedef : path和wpath。 使用它須要包含"boost/filesystem.hpp"。linux
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_name boost::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.dat std::string s = p2.stem().string(); //不含擴展名的文件名: data std::string extName = p2.extension().string(); //擴展名: dat p1.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); //目錄是否爲空或文件大小是否爲0 boost::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的類型轉換函數,所以這裏是隱式轉換 else cout << *pos << endl; //輸出文件名 } } //directory_iterator不支持深度遍歷,可使用效率更高的recursive_directory_iterator或wrecursive_directory_iterator typedef 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_iterator cout << pos.level() << endl; //得到當前目錄深度 cout << *pos << endl; //輸出文件名 }