【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盤。。。
在這里插入圖片描述

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/377659.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/377659.shtml
英文地址,請注明出處:http://en.pswp.cn/news/377659.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

scala hashmap_如何在Scala中將Hashmap轉換為Map?

scala hashmapLets first understand what are maps and hashmaps? 首先讓我們了解什么是map和hashmap &#xff1f; map in Scala is a collection that stores its elements as key-value pairs, like a dictionary. Scala中的map是一個集合&#xff0c;將其元素存儲為鍵值…

十二、所有功能實現效果演示

一、系統項目架構 Ⅰ&#xff0c;fiber_yy數據庫下有五張表 yy_admin&#xff1a;管理員登錄賬號和密碼 yy_textile&#xff1a;紡織面料數據信息 yy_textile_record&#xff1a;用戶購買紡織面料信息所存儲的面料流水信息 yy_user&#xff1a;用戶登錄注冊信息 yy_user_reco…

行業軟件之PTV微觀軟件VISSIM4.3 5.0 5.1 5.2 5.3 5.4下載和相關資料

他是干什么的&#xff1a;http://baike.baidu.com/view/3656765.htm 中國代理銷售的公司的網址&#xff1a;辟途威交通科技(上海)有限公司 官網&#xff1a;http://www.ptvchina.cn/ 看看視頻中軟件的運行效果&#xff1a;http://v.youku.com/v_show/id_XMzExMjg1MDEy.html 如何…

一、單個神經元網絡構建

一、本人使用編譯器為Jupyter Notebook&#xff0c;tensorflow版本為1.13.1 import tensorflow as tf print(tf.__version__) """ 1.13.1 """二、訓練單個神經元網絡 x為-1.0, 0.0, 1.0, 2.0, 3.0, 4.0 y為-3.0, -1.0, 1.0, 3.0, 5.0, 7.0 人用…

ruby 生成隨機字符串_Ruby程序生成隨機數

ruby 生成隨機字符串產生隨機數 (Generating random number) The task is to generate and print random number. 任務是生成并打印隨機數。 Generating random numbers means that any number can be provided to you which is not dependent on any pre-specified condition…

leetcode 322. 零錢兌換 思考分析

目錄1、題目2、思路分析3、參考鏈接1、題目 給定不同面額的硬幣 coins 和一個總金額 amount。編寫一個函數來計算可以湊成總金額所需的最少的硬幣個數。如果沒有任何一種硬幣組合能組成總金額&#xff0c;返回 -1。 你可以認為每種硬幣的數量是無限的。 提示&#xff1a; 1 …

linux上的英文字體monospace可以在windows用嗎?

linux的字體都是開源的&#xff0c;應該可以官方下載本地下載轉載于:https://www.cnblogs.com/52linux/archive/2012/03/14/2396103.html

Flash Builder 創建CSS

1.global 選擇器將樣式應用于所有控件 在 Flash Builder 中創建新MXML 文件并切換到設計模式 屬性視圖右側的外觀視圖可更改外觀 Flash Builder 自動創建CSS 文件 CSS 文件有2 個命名空間&#xff1a; s 指 Spark 組件 mx 指 MX 組件 1. Global 與Application 選擇器 global …

ruby打印_Ruby程序打印數字的力量

ruby打印Ruby中數字的冪 (Power of a number in Ruby) The task to develop a program that prints power of a number in Ruby programming language. 開發可以用Ruby編程語言打印數字冪的程序的任務。 If we want to calculate the power of a number manually then we have…

二、訓練fashion_mnist數據集

一、加載fashion_mnist數據集 fashion_mnist數據集中數據為28*28大小的10分類衣物數據集 其中訓練集60000張&#xff0c;測試集10000張 from tensorflow import keras import tensorflow as tf import matplotlib.pyplot as plt import numpy as npfashion_mnist keras.data…

jquerymobile 切換頁面時候閃爍問題

https://github.com/jquery/jquery-mobile/commit/acbec71e29b6acec6cd2087e84e8434fecc0053f 可以修改css好像是個bug -4,9 4,10 * Dual licensed under the MIT (MIT-LICENSE.txt) or GPL (GPL-LICENSE.txt) licenses.*/.spin {--webkit-animation-name: spin;--webkit-an…

二分法:兩個有序數組長度為N,找到第N、N+1大的數

題目 兩個有序數組長度為N&#xff0c;找到第N、N1大的數 思路1&#xff1a;雙指針&#xff0c;O(N)復雜度 簡述思路&#xff1a; 如果當前A指針指向的數組A的內容小于B指針指向的數組B的內容&#xff0c;那么A指針往右移動&#xff0c;然后nums(當前已經遍歷過的數字個數)也…

Javascript -- In

http://www.caveofprogramming.com/articles/javascript-2/javascript-in-using-the-in-operator-to-iterate-through-arrays-and-objects/ http://msdn.microsoft.com/en-us/library/ie/9k25hbz2(vvs.94).aspx轉載于:https://www.cnblogs.com/daishuguang/p/3392310.html

三、自動終止訓練

有時候&#xff0c;當模型損失函數值預期的效果時&#xff0c;就可以結束訓練了&#xff0c;一方面節約時間&#xff0c;另一方面防止過擬合 此時&#xff0c;設置損失函數值小于0.4&#xff0c;訓練停止 from tensorflow import keras import tensorflow as tf import matplo…

矩陣形狀| 使用Python的線性代數

Prerequisite: Linear Algebra | Defining a Matrix 先決條件&#xff1a; 線性代數| 定義矩陣 In the python code, we will add two Matrices. We can add two Matrices only and only if both the matrices have the same dimensions. Therefore, knowing the dimensions o…

[數據庫]oracle客戶端連服務器錯誤

昨天晚上和今天上午用11g客戶端連同事10g服務器&#xff0c;報錯&#xff1a; The Network Adapter could not establish the connection 檢查嘗試了好多次都沒好。 用程序連&#xff0c;依舊是報這個錯&#xff0c;所以一查就解決了&#xff01; 參考&#xff1a;http://apps…

ASP.NET 抓取網頁內容

&#xff08;轉&#xff09;ASP.NET 抓取網頁內容 ASP.NET 抓取網頁內容&#xff0d;文字 ASP.NET 中抓取網頁內容是非常方便的&#xff0c;而其中更是解決了 ASP 中困擾我們的編碼問題。 需要三個類&#xff1a;WebRequest、WebResponse、StreamReader。 WebRequest、WebRespo…

leetcode 53. 最大子序和 動態規劃解法、貪心法以及二分法

題目 給定一個整數數組 nums &#xff0c;找到一個具有最大和的連續子數組&#xff08;子數組最少包含一個元素&#xff09;&#xff0c;返回其最大和。 示例: 輸入: [-2,1,-3,4,-1,2,1,-5,4] 輸出: 6 解釋: 連續子數組 [4,-1,2,1] 的和最大&#xff0c;為 6。 進階: 如果你…

四、卷積神經網絡(Convolution Neural Networks)

一、CNN(Convolution Neural Networks) 卷積神經網絡基本思想&#xff1a;識別物體的特征&#xff0c;來進行判斷物體 卷積Convolution&#xff1a;過濾器filter中的數值與圖片像素值對應相乘再相加&#xff0c;6 * 6卷積一次(步數為1)變成4 * 4 Max Pooling&#xff1a;對卷積…

POJ3096Surprising Strings(map)

題意&#xff1a;輸入很多字符串&#xff0c;以星號結束。判斷每個字符串是不是“Surprising Strings”&#xff0c;判斷方法是&#xff1a;以“ZGBG”為例&#xff0c;“0-pairs”是ZG&#xff0c;GB&#xff0c;BG&#xff0c;這三個子串不相同&#xff0c;所以是“0-unique”…