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ů.

ai (1) architekt (1) Bash (2) bitwig (2) bitwig6 (1) c++ (54) cheatsheet (1) clang-format (1) class (1) cmake (3) cmake-format (1) conan (2) constexpr if (1) cz (2) daw (2) decltype(x) (1) desktop (2) duševní zdraví (1) email (1) emoce (4) enum (1) enum class (1) functor (1) git (1) gnome (4) gnome-extension (1) helloworld (2) hranice (1) js (1) keyboard (2) linux (6) llm (1) lvalue (1) metodika řízení (2) midi (2) modern c++ (48) motivace (1) music (6) music production (1) native instruments (1) nodiscard (1) noexcept (1) operator (1) osobnost (1) osobní hranice (1) override (1) package manager (1) Perfect Forwarding (1) plugin (1) poděkování (1) polymorfism (1) prospěch (1) psyché (2) python (2) rspamd (1) rvalue (1) růst (2) scale (2) self-stress (1) sociální sítě (1) software (1) spam (1) std (28) std::accumulate (1) std::async (2) std::divides (1) std::filesystem::path (2) std::forward (1) std::future (3) std::istream_iterator (1) std::latch (1) std::lerp (1) std::minus (1) std::modulus (1) std::multiplies (1) std::negate (1) std::ostream_iterator (1) std::packaged_task (1) std::partition (1) std::partition_copy (1) std::plus (1) std::promise (2) std::shiftleft (1) std::shuffle (1) std::transform (1) std::tuple (1) std::variant (1) std::views::transform (1) std::visit (1) strach (1) strategie (1) synthesizer (1) toxic (2) toxicita (1) toxík (1) using (2) vztah k sobě (1) vztahy (3) vývoj (1) zdraví (2)