std::filesystem::file_size în C++

Returnează dimensiunea unui fișier, în octeți.

Sintaxă
std::uintmax_t file_size(const std::filesystem::path& p);
std::uintmax_t file_size(const std::filesystem::path& p, std::error_code& ec) noexcept;

Ce face std::filesystem::file_size

file_size(p) returnează numărul de octeți din fișierul p. Fișierul nu este deschis și nici citit, deci funcția este rapidă și pentru fișiere mari.

Dacă fișierul nu există sau p este un director, aruncă std::filesystem::filesystem_error. Cu varianta cu std::error_code nu se aruncă nimic: rezultatul este static_cast<std::uintmax_t>(-1), iar eroarea ajunge în ec.

Parametri

Parametru Descriere
p Calea fișierului.
ec Opțional: primește eroarea în loc de excepție.

Ce returnează

Dimensiunea în octeți (std::uintmax_t).

Exemple

Exemplul 1: Mărimea unui fișier scris de program

Caracterele cu diacritice ocupă câte 2 octeți în UTF-8, de aceea „Iași” are 5 octeți.

#include <filesystem>
#include <fstream>
#include <print>

int main() {
    namespace fs = std::filesystem;
    std::ofstream("oras.txt") << "Iași";
    std::ofstream("gol.txt");

    std::println("oras.txt: {} octeți", fs::file_size("oras.txt"));
    std::println("gol.txt: {} octeți", fs::file_size("gol.txt"));
}

Rezultat

oras.txt: 5 octeți
gol.txt: 0 octeți

Exemplul 2: Fișier inexistent, cu și fără excepție

#include <filesystem>
#include <print>
#include <system_error>

int main() {
    namespace fs = std::filesystem;

    std::error_code ec;
    auto marime = fs::file_size("lipsa.txt", ec);
    if (ec) {
        std::println("Eroare: {}", ec.message());
    } else {
        std::println("{} octeți", marime);
    }

    try {
        std::println("{}", fs::file_size("lipsa.txt"));
    } catch (const fs::filesystem_error& e) {
        std::println("Excepție: {}", e.what());
    }
}

Rezultat

Eroare: No such file or directory
Excepție: filesystem error: in file_size: No such file or directory ["lipsa.txt"]

Greșeli frecvente

  • Citești tot fișierul doar ca să-i afli mărimea. file_size o returnează direct, fără să citească nimic.

Comenzi înrudite