Namespaces
Variants

std::filesystem:: file_size

From cppreference.net
Definido en el encabezado <filesystem>
(1) (desde C++17)
(2) (desde C++17)

Si p no existe, reporta un error.

Para un archivo regular p , devuelve el tamaño determinado como si se leyera el miembro st_size de la estructura obtenida mediante POSIX stat (los enlaces simbólicos se siguen).

El resultado de intentar determinar el tamaño de un directorio (así como de cualquier otro archivo que no sea un archivo regular o un enlace simbólico) está definido por la implementación.

La sobrecarga que no lanza excepciones devuelve static_cast < std:: uintmax_t > ( - 1 ) en caso de errores.

Contenidos

Parámetros

p - ruta a examinar
ec - parámetro de salida para reporte de errores en la sobrecarga no lanzadora

Valor de retorno

El tamaño del archivo, en bytes.

Excepciones

Cualquier sobrecarga no marcada como noexcept puede lanzar std::bad_alloc si la asignación de memoria falla.

1) Lanza std::filesystem::filesystem_error en errores de API del sistema operativo subyacente, construido con p como primer argumento de ruta y el código de error del sistema operativo como argumento de código de error.
2) Establece un parámetro std:: error_code & al código de error de la API del sistema operativo si una llamada a la API del sistema operativo falla, y ejecuta ec. clear ( ) si no ocurren errores.

Ejemplo

#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';
    }
}

Salida posible:

"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

Véase también

cambia el tamaño de un archivo regular mediante truncamiento o relleno con ceros
(función)
(C++17)
determina el espacio libre disponible en el sistema de archivos
(función)
devuelve el tamaño del archivo al que se refiere la entrada de directorio
(función miembro pública de std::filesystem::directory_entry )