c++ fielsystem庫(kù)的具體使用
C++17 引入了 <filesystem> 庫(kù),它提供了一組用于操作文件和路徑的工具。這個(gè)庫(kù)極大地簡(jiǎn)化了文件和目錄的管理,使得在不同操作系統(tǒng)上進(jìn)行文件操作更加方便和統(tǒng)一。以下是對(duì) <filesystem> 庫(kù)的詳細(xì)介紹,包括其主要概念和函數(shù)。
1.引入頭文件
在使用 <filesystem> 庫(kù)之前,需要包含相應(yīng)的頭文件:
#include <filesystem>
命名空間為 std::filesystem,通??梢酝ㄟ^(guò) using namespace std::filesystem; 來(lái)簡(jiǎn)化代碼。
2.路徑(Path)
路徑是 <filesystem> 庫(kù)的核心概念之一,表示文件或目錄的位置。路徑可以是絕對(duì)路徑或相對(duì)路徑。
創(chuàng)建路徑
path p = "example.txt"; // 相對(duì)路徑 path q = "/home/user/example.txt"; // 絕對(duì)路徑
路徑操作
拼接路徑:使用 / 運(yùn)算符或 concat 函數(shù)。
path p = "folder"; path q = p / "file.txt"; // folder/file.txt
獲取路徑信息:
path p = "/home/user/example.txt"; cout << p.filename() << endl; // example.txt cout << p.parent_path() << endl; // /home/user cout << p.extension() << endl; // .txt cout << p.stem() << endl; // example
p.string():將路徑轉(zhuǎn)換為字符串。p.c_str():獲取路徑的 C 風(fēng)格字符串。p.filename():獲取路徑的最后一部分(文件名或目錄名)。p.parent_path():獲取路徑的父目錄。p.extension():獲取文件的擴(kuò)展名。p.stem():獲取文件名去掉擴(kuò)展名的部分。
3.文件操作
檢查文件狀態(tài)
exists(path):檢查路徑是否存在。if (exists("example.txt")) { cout << "File exists" << endl; }is_regular_file(path):檢查路徑是否指向普通文件。is_directory(path):檢查路徑是否指向目錄。is_symlink(path):檢查路徑是否為符號(hào)鏈接。file_size(path):獲取文件大?。ㄒ宰止?jié)為單位)。if (is_regular_file("example.txt")) { cout << "File size: " << file_size("example.txt") << " bytes" << endl; }
創(chuàng)建和刪除文件
create_directory(path):創(chuàng)建一個(gè)目錄。create_directories(path):創(chuàng)建多級(jí)目錄。remove(path):刪除文件或目錄。create_directory("testdir"); create_directories("testdir/subdir"); remove("testdir/subdir"); remove("testdir");
復(fù)制和移動(dòng)文件
copy_file(from, to):復(fù)制文件。rename(from, to):重命名或移動(dòng)文件。copy_file("source.txt", "destination.txt"); rename("oldname.txt", "newname.txt");
4.目錄操作
遍歷目錄
directory_iterator:用于遍歷目錄中的文件和子目錄。
for (const auto& entry : directory_iterator("testdir")) {
cout << entry.path() << endl;
}
獲取目錄內(nèi)容
directory_iterator提供了多種成員函數(shù):path():獲取路徑。is_directory():判斷是否為目錄。is_regular_file():判斷是否為普通文件。
for (const auto& entry : directory_iterator("testdir")) { if (entry.is_directory()) { cout << entry.path() << " is a directory" << endl; } else if (entry.is_regular_file()) { cout << entry.path() << " is a file" << endl; } }
5.文件狀態(tài)和權(quán)限
獲取文件狀態(tài)
status(path):獲取文件的狀態(tài)。permissions(path):獲取文件的權(quán)限。file_status status = status("example.txt"); if (status.permissions() == perms::owner_read) { cout << "File is readable by owner" << endl; }
修改文件權(quán)限
permissions(path, perms):修改文件權(quán)限。permissions("example.txt", perms::owner_read | perms::owner_write);
6.文件流與文件系統(tǒng)
<filesystem> 庫(kù)與 C++ 的文件流(如 ifstream 和 ofstream)可以無(wú)縫配合??梢灾苯訉?path 對(duì)象傳遞給文件流構(gòu)造函數(shù):
ifstream in("example.txt");
ofstream out("output.txt");
7.錯(cuò)誤處理
<filesystem> 庫(kù)使用異常機(jī)制處理錯(cuò)誤。如果操作失敗,會(huì)拋出 filesystem_error 異常。可以通過(guò) try-catch 塊捕獲并處理這些異常:
try {
remove("nonexistent_file.txt");
} catch (const filesystem_error& e) {
cerr << e.what() << endl;
}
8.示例代碼
以下是一個(gè)綜合示例,展示了 <filesystem> 庫(kù)的多種功能:
#include <iostream>
#include <filesystem>
using namespace std;
using namespace std::filesystem;
int main() {
path p = "example.txt";
if (!exists(p)) {
ofstream out(p);
out << "Hello, Filesystem!" << endl;
out.close();
}
cout << "File size: " << file_size(p) << " bytes" << endl;
path dir = "testdir";
create_directory(dir);
for (const auto& entry : directory_iterator(dir.parent_path())) {
if (entry.is_directory()) {
cout << entry.path() << " is a directory" << endl;
}
}
copy_file(p, dir / p.filename());
remove(p);
return 0;
}
9.總結(jié)
<filesystem> 庫(kù)為 C++ 提供了一種現(xiàn)代且跨平臺(tái)的方式來(lái)操作文件和目錄。它簡(jiǎn)化了許多復(fù)雜的文件操作任務(wù),并且與 C++ 的其他標(biāo)準(zhǔn)庫(kù)無(wú)縫集成。通過(guò)掌握路徑操作、文件操作、目錄操作以及錯(cuò)誤處理等核心功能,可以高效地處理文件和目錄相關(guān)的任務(wù)。
到此這篇關(guān)于c++ fielsystem庫(kù)的具體使用的文章就介紹到這了,更多相關(guān)c++ fielsystem庫(kù)內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
Vscode配置C/C++環(huán)境使用minGW(保姆級(jí)配置過(guò)程)
本文主要介紹了Vscode配置C/C++環(huán)境使用minGW(保姆級(jí)配置過(guò)程),文中通過(guò)示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2022-02-02
QT實(shí)現(xiàn)制作一個(gè)ListView列表的示例代碼
這篇文章主要為大家詳細(xì)介紹了如何使用Qt制作一個(gè)ListView,點(diǎn)擊ListView的Item可以用于測(cè)試OpenCV的各種效果,感興趣的小伙伴可以了解一下2023-02-02
C++實(shí)現(xiàn)LeetCode(201.數(shù)字范圍位相與)
這篇文章主要介紹了C++實(shí)現(xiàn)LeetCode(201.數(shù)字范圍位相與),本篇文章通過(guò)簡(jiǎn)要的案例,講解了該項(xiàng)技術(shù)的了解與使用,以下就是詳細(xì)內(nèi)容,需要的朋友可以參考下2021-08-08
詳談c++11 final與override說(shuō)明符
下面小編就為大家?guī)?lái)一篇詳談c++11 final與override說(shuō)明符。小編覺(jué)得挺不錯(cuò)的,現(xiàn)在就分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧2017-01-01
C?語(yǔ)言實(shí)現(xiàn)猜數(shù)字小游戲完整示例代碼
這篇文章主要介紹了如何使用C語(yǔ)言生成1到100之間的隨機(jī)數(shù),并提供了一個(gè)簡(jiǎn)單的猜數(shù)字游戲的實(shí)現(xiàn)代碼,文中通過(guò)代碼介紹的非常詳細(xì),需要的朋友可以參考下2025-03-03

