Práce s std::filesystem::path a std::filesystem::directory_iterator v C++
C++ standardní knihovna od verze C++17 obsahuje modul std::filesystem, který poskytuje nástroje pro práci se souborovým systémem. Tento modul umožňuje snadnou manipulaci s cestami, práci se soubory a adresáři, a také iteraci přes obsah adresářů. V tomto článku se zaměříme na dvě klíčové třídy: std::filesystem::path a std::filesystem::directory_iterator.
std::filesystem::path
Třída std::filesystem::path slouží k reprezentaci cest v souborovém systému. Cesty mohou být absolutní nebo relativní a mohou obsahovat různé formáty (např. Windows nebo Unix). Tato třída poskytuje metody pro snadnou manipulaci s jednotlivými částmi cesty.
Základní použití
#include <iostream>
#include <filesystem>
int main() {
namespace fs = std::filesystem;
fs::path cesta{"./example/file.txt"};
std::cout << "Původní cesta: " << cesta << '\n';
std::cout << "Kořenová část: " << cesta.root_name() << '\n';
std::cout << "Rodičovský adresář: " << cesta.parent_path() << '\n';
std::cout << "Název souboru: " << cesta.filename() << '\n';
std::cout << "Přípona: " << cesta.extension() << '\n';
return 0;
}
Klíčové metody
root_name(): Vrací kořenovou část cesty (např.C:na Windows).parent_path(): Vrací cestu k nadřazenému adresáři.filename(): Vrací název souboru nebo adresáře.extension(): Vrací příponu souboru.
Třída std::filesystem::path také podporuje operace jako spojování cest pomocí operátoru /:
fs::path base = "/home/user";
fs::path full = base / "documents" / "file.txt";
std::cout << full << '\n'; // Výstup: /home/user/documents/file.txt
std::filesystem::directory_iterator
Třída std::filesystem::directory_iterator umožňuje iteraci přes obsah adresáře. Můžete ji použít k získání seznamu souborů a podadresářů v daném adresáři.
Základní použití
#include <iostream>
#include <filesystem>
int main() {
namespace fs = std::filesystem;
fs::path dir{"./example"};
if (fs::exists(dir) && fs::is_directory(dir)) {
std::cout << "Obsah adresáře " << dir << ":\n";
for (const auto& entry : fs::directory_iterator(dir)) {
std::cout << entry.path() << '\n';
}
} else {
std::cout << "Adresář neexistuje nebo není platný.\n";
}
return 0;
}
Klíčové vlastnosti
entry.path(): Vrací cestu k aktuálnímu souboru nebo adresáři.fs::is_directory(entry): Zjišťuje, zda je položka adresář.fs::is_regular_file(entry): Zjišťuje, zda je položka běžný soubor.
Kombinace std::filesystem::path a std::filesystem::directory_iterator
Obě třídy lze snadno kombinovat pro složitější operace. Například můžete iterovat přes adresář a filtrovat pouze soubory s určitou příponou:
#include <iostream>
#include <filesystem>
int main() {
namespace fs = std::filesystem;
fs::path dir{"./example"};
if (fs::exists(dir) && fs::is_directory(dir)) {
std::cout << "Soubory s příponou .txt v adresáři " << dir << ":\n";
for (const auto& entry : fs::directory_iterator(dir)) {
if (entry.is_regular_file() && entry.path().extension() == ".txt") {
std::cout << entry.path().filename() << '\n';
}
}
}
return 0;
}
Závěr
Modul std::filesystem v C++ poskytuje výkonné nástroje pro práci se souborovým systémem. Třída std::filesystem::path umožňuje snadnou manipulaci s cestami, zatímco std::filesystem::directory_iterator usnadňuje iteraci přes obsah adresářů. Tyto nástroje jsou užitečné pro širokou škálu aplikací, od jednoduchých skriptů po komplexní systémy pro správu souborů.