日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程语言 > c/c++ >内容正文

c/c++

【C++grammar】文件系统以及path类使用

發布時間:2023/12/1 c/c++ 53 豆豆
生活随笔 收集整理的這篇文章主要介紹了 【C++grammar】文件系统以及path类使用 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

目錄

  • 1.文件系統概述
    • 1、關于路徑
    • 2、如何將某個路徑下的所有文件遞歸地找出來?
  • 2.路徑類及操作
    • 1、path類的成員函數
    • 2、path類的非成員函數
  • 示例1:展示C++17中的path對象的用法
  • 示例2:展示Path類中用于分解路徑成分的函數
  • 示例3:展示path相關的一些特殊運算符用法
  • 示例4:展示如何獲取磁盤空間信息

1.文件系統概述

標準庫的filesystem提供在文件系統與其組件,例如路徑、常規文件與目錄上進行操作的方法。

(1) File(文件):持有數據的文件系統對象,能被寫入或讀取。文件有名稱和屬性,屬性之一是文件類型
(2) Path(路徑):標識文件所處位置的一系列元素,可能包含文件名

namespace fs = std::filesystem;
fs::path p{ “CheckPath.cpp” };

1、關于路徑

絕對路徑:包含完整的路徑和驅動器符號
相對路徑:不包含驅動器及開頭的/符號,文件存在相對于“當前路徑”的位置。

//為名字空間起一個別名 namespace fs = std::filesystem; fs::path p1("d:\\cpp\\hi.txt"); //字符串中的反斜杠要被轉義 fs::path p2(); //Windows 也支持正斜杠 fs::path p3(R"(d:\cpp\hi.txt)"); //使用原始字符串字面量

2、如何將某個路徑下的所有文件遞歸地找出來?

我們在windows上可以使用tree /f 這個命令,將當前目錄下面的所有子目錄以及文件全部都列出來。

如果我們想用C++17的文件系統庫寫個類似的程序,將當前目錄下面的所有子目錄以及文件全部都【遞歸地】列出來,該怎么做?
獲取路徑下的所有文件/文件夾,需要遍歷的文件夾路徑,將子文件夾的路徑也添加到list集合中就可以了。

2.路徑類及操作

1、path類的成員函數

部分重要的成員函數說明
+path(string)構造函數
+assign(string): path&為路徑對象賦值
+append(type p): path&將p追加到路徑后。type是string、path或const char*。等價于 /= 運算符;自動添加目錄分隔符
+concat(type p): path&將p追加到路徑后。type是string、path或const char*。等價于+=運算符;不自動添加目錄分隔符
+clear(): void清空存儲的路徑名
+remove_filename(): path&從給定的路徑中移除文件名
+replace_filename(const path& replacement): path&以 replacement 替換文件名
+root_name(): path返回通用格式路徑的根名
+root_directory(): path返回通用格式路徑的根目錄
+root_path(): path返回路徑的根路徑,等價于 root_name() / root_directory(),即“路徑的根名 / 路徑的根目錄”
+relative_path(): path返回相對于 root-path 的路徑
+parent_path(): path返回到父目錄的路徑
+filename(): path返回路徑中包含的文件名
+stem(): path返回路徑中包含的文件名,不包括文件的擴展名
+extension(): path返回路徑中包含的文件名的擴展名
+empty(): bool檢查路徑是否為空
+has_xxx(): bool其中“xxx”是上面“分解”類別中的函數名。這些函數檢查路徑是否含有相應路徑元素

2、path類的非成員函數

部分重要的非成員函數說明
operator/( const path& lhs, const path& rhs )以偏好目錄分隔符連接二個路徑成分 lhs 和 rhs。比如 path p{“C:”}; p = p / “Users” / “batman”;
operator <<, >> (path p)進行路徑 p 上的流輸入或輸出
s_regular_file( const path& p ): bool檢查路徑是否是常規文件
is_directory( const path& p ): bool檢查路徑是否是目錄
is_empty( const path& p ): bool檢查給定路徑是否指代一個空文件或目錄
current_path(): path
current_path( const path& p ): void更改當前路徑為p (類似linux指令 cd)
file_size( const path& p ): uintmax_t對于常規文件 p ,返回其大小;嘗試確定目錄(以及其他非常規文件)的大小的結果是由編譯器決定的
space(const path& p): space_info返回路徑名 p 定位于其上的文件系統信息。space_info中有三個成員:capacity ——文件系統的總大小(字節),free ——文件系統的空閑空間(字節),available ——普通進程可用的空閑空間(小于或等于 free )
status(const path& p): file_status返回 p 所標識的文件系統對象的類型與屬性。返回的file_status是一個類,其中包含文件的類型(type)和權限(permissions)
remove(const path& p): bool刪除路徑 p 所標識的文件或空目錄
remove_all(const path& p): uintmax_t遞歸刪除 p 的內容(若它是目錄)及其子目錄的內容,然后刪除 p 自身,返回被刪文件及目錄數量
rename(const path& old_p,const path& new_p): void移動或重命名 old_p 所標識的文件系統對象到 new_p(類似linux指令mv)
copy( const path& from, const path& to ): void復制文件與目錄。另外一個函數 bool copy_file(from, to) 拷貝單個文件
create_directory( const path& p ): bool創建目錄 p (父目錄必須已經存在),若 p 已經存在,則函數無操作
create_directories( const path& p ): bool創建目錄 p (父目錄不一定存在),若 p 已經存在,則函數無操作

示例1:展示C++17中的path對象的用法

本部分要展示的內容如下; 展示C++17中的path對象的用法 int main() {//定義路徑,使用生字符串、轉義字符串、正斜杠字符串//輸出默認文件分隔符//判斷是否是常規文件,如果是,輸出文件大小//判斷是否是目錄,如果是目錄,列出其子目錄//判斷路徑是否存在 }

修改C++標準可以查看這篇文章:
VS 如何修改C++編譯標準

//必須打開C++17支持 #include <iostream> #include <filesystem> #include <string>namespace fs = std::filesystem;int main() {//定義路徑,使用生字符串、轉義字符串、正斜杠字符串//生字符串fs::path p1{R"(C:\Users\15409\source\repos\file_test\Hello.txt)"};//轉義字符串fs::path p2{ "C:\\Users\\15409\\source\\repos\\file_test\\Hello.txt" };//正斜杠字符串fs::path p3{ "C:/Users/15409/source/repos/file_test/Hello.txt" };//輸出默認文件分隔符std::cout << fs::path::preferred_separator << std::endl;//判斷是否是常規文件,如果是,輸出文件大小if (fs::is_regular_file(p2)){std::cout << p2 <<" s size is:"<<fs::file_size(p2) << std::endl;}//如果不是常規文件的話,可能是一個目錄else if (fs::is_directory(p2)){std::cout << p2 << "is a directory,includes:" << std::endl;//打印出它的所有子目錄for (auto& e : fs::directory_iterator(p2))std::cout << " " << e.path() << std::endl;}//判斷路徑是否存在else if (fs::exists(p2)){std::cout << p2 << "is a special file\n";}//文件不存在else{std::cout << p2 << "is not exist\n" << std::endl;} }

效果:
1、如果路徑中沒有找到這個文件:

2、如果路徑中存在這個文件:


輸出文件大小:

3、將p2修改為文件路徑:
fs::path p2{ "C:\\Users\\15409\\source\\repos\\file_test" };
輸出該目錄下所有文件名字

示例2:展示Path類中用于分解路徑成分的函數

示例2: 本部分要展示的內容如下; 任務:展示Path類中用于分解路徑成分的函數是否存在?根名?根路徑?相對路徑?父路徑?文件名?文件名主干?擴展名? /*****************************示例2************************************/ //必須打開C++17支持 #include <iostream> #include <filesystem> #include <string>namespace fs = std::filesystem;using std::cout; using std::endl;int main() {//定義路徑pfs::path p{R"(C:\Users\15409\source\repos\file_test\main.cpp)"};//是否存在根名?根路徑?相對路徑if (p.empty()){cout << "Path" << p << "is empty." << endl;}if (!fs::exists(p)){cout << "Path " << p << "dose not exist." << endl;std::exit(0);}cout << "root_name():" << p.root_name() << "\n"<< "root_path():" << p.root_path() << "\n"<< "relative_path():" << p.relative_path() << "\n";cout << "parent_path():" << p.parent_path() << "\n"<< "filename(): " << p.filename() << "\n"<< "stem(): " << p.stem() << "\n"<< "extension():" << p.extension() << "\n";//父路徑?文件名?文件名主干?擴展名? }

效果:

示例3:展示path相關的一些特殊運算符用法

示例3: 本部分要展示的內容如下; 任務:展示path相關的一些特殊運算符用法 //必須打開C++17支持 #include <iostream> #include <filesystem> #include <string>namespace fs = std::filesystem;using std::cout; using std::endl;int main() {//定義路徑pfs::path p1{ R"(C:\Users\15409\source\repos)" };fs::path p2{ R"(C:\Users\15409\source\repos)" };fs::path p3{ "" };//append 和 /=p1.append(R"(file_test)");p1 /= R"(p1)";cout << p1 << endl;//concat 和 +=, 這兩個操作和上面兩個的區別在于不會主動添加斜杠p2.concat(R"(file_test)");p2 += R"(p2)";cout << p2 << endl;//用運算符 / 拼湊一個新路徑,是對一個path對象進行拼接,不能對字符串進行拼接p3 = p3 / R"(file_test)" / R"(p3)";cout << p3 << endl; }

效果:

示例4:展示如何獲取磁盤空間信息

示例4: 本部分要展示的內容如下; 任務:展示如何獲取磁盤空間信息任務: 使用filesystem::space()函數,獲取某路徑所在分區的space_info對象,然后顯示磁盤分區信息。 //必須打開C++17支持 #include <iostream> #include <filesystem> #include <string>int main() {namespace fs = std::filesystem;using std::cout;using std::endl;//定義路徑對象fs::path p{"C:\\"};//展示磁盤的總大小和剩余大小,顯示的是字節數cout << "C:total space: " << fs::space(p).capacity <<"b"<< endl;cout << "C:free space:" << fs::space(p).free << "b" << endl;cout << "C:total space: " << fs::space(p).capacity/(1024*1024*1024) << "G" << endl;cout << "C:free space:" << fs::space(p).free/ (1024 * 1024 * 1024) << "G" << endl; }

效果:我的C盤。。。

總結

以上是生活随笔為你收集整理的【C++grammar】文件系统以及path类使用的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。