Namensräume
Varianten
Aktionen

std::filesystem::file_size

Von cppreference.com
 
 
 
Definiert in Header <filesystem>
std::uintmax_t file_size( const std::filesystem::path& p );
(1) (seit C++17)
std::uintmax_t file_size( const std::filesystem::path& p,
                          std::error_code& ec ) noexcept;
(2) (seit C++17)

Wenn p nicht existiert, wird ein Fehler gemeldet.

Für eine reguläre Datei p wird die Größe zurückgegeben, die sich so ergibt, als würde das st_size-Mitglied der Struktur gelesen, die durch POSIX stat erhalten wird (Symlinks werden verfolgt).

Das Ergebnis des Versuchs, die Größe eines Verzeichnisses (sowie jeder anderen Datei, die keine reguläre Datei oder ein Symlink ist) zu ermitteln, ist implementierungsabhängig.

Die nicht werfende Überladung gibt im Fehlerfall static_cast<std::uintmax_t>(-1) zurück.

Inhalt

[bearbeiten] Parameter

p - Zu untersuchender Pfad
ec - Ausgabeparameter für die Fehlerberichterstattung in der nicht auslösenden Überladung

[bearbeiten] Rückgabewert

Die Größe der Datei in Bytes.

[bearbeiten] Ausnahmen

Jede Überladung, die nicht als noexcept markiert ist, kann std::bad_alloc auslösen, wenn die Speicherzuweisung fehlschlägt.

1) Wirft std::filesystem::filesystem_error bei zugrundeliegenden Betriebssystem-API-Fehlern, konstruiert mit p als erstem Pfadargument und dem Betriebssystem-Fehlercode als Fehlercodeargument.
2) Setzt einen std::error_code& Parameter auf den Betriebssystem-API-Fehlercode, wenn ein Betriebssystem-API-Aufruf fehlschlägt, und führt ec.clear() aus, wenn keine Fehler auftreten.

[bearbeiten] Beispiel

#include <cmath>
#include <filesystem>
#include <fstream>
#include <iostream>
namespace fs = std::filesystem;
 
struct HumanReadable
{
    std::uintmax_t size{};
 
private:
    friend std::ostream& operator<<(std::ostream& os, HumanReadable hr)
    {
        int o{};
        double mantissa = hr.size;
        for (; mantissa >= 1024.; mantissa /= 1024., ++o);
        os << std::ceil(mantissa * 10.) / 10. << "BKMGTPE"[o];
        return o ? os << "B (" << hr.size << ')' : os;
    }
};
 
int main(int, char const* argv[])
{
    fs::path example = "example.bin";
    fs::path p = fs::current_path() / example;
    std::ofstream(p).put('a'); // create file of size 1
    std::cout << example << " size = " << fs::file_size(p) << '\n';
    fs::remove(p);
 
    p = argv[0];
    std::cout << p << " size = " << HumanReadable{fs::file_size(p)} << '\n';
 
    try
    {
        std::cout << "Attempt to get size of a directory:\n";
        [[maybe_unused]] auto x_x = fs::file_size("/dev");
    }
    catch (fs::filesystem_error& e)
    {
        std::cout << e.what() << '\n';
    }
 
    for (std::error_code ec; fs::path bin : {"cat", "mouse"})
    {
        bin = "/bin"/bin;
        if (const std::uintmax_t size = fs::file_size(bin, ec); ec)
            std::cout << bin << " : " << ec.message() << '\n';
        else
            std::cout << bin << " size = " << HumanReadable{size} << '\n';
    }
}

Mögliche Ausgabe

"example.bin" size = 1
"./a.out" size = 22KB (22512)
Attempt to get size of a directory:
filesystem error: cannot get file size: Is a directory [/dev]
"/bin/cat" size = 50.9KB (52080)
"/bin/mouse" : No such file or directory

[bearbeiten] Siehe auch

ändert die Größe einer regulären Datei durch Abschneiden oder Auffüllen mit Nullen
(Funktion) [bearbeiten]
ermittelt den verfügbaren freien Speicherplatz auf dem Dateisystem
(Funktion) [bearbeiten]
gibt die Größe der Datei zurück, auf die der Verzeichniseintrag verweist
(öffentliche Elementfunktion von std::filesystem::directory_entry) [bearbeiten]