c++ c++17 filesize c++-standard-library

Cómo obtener el tamaño de archivo en bytes con C++ 17



c++17 filesize (2)

¿Hay dificultades para sistemas operativos específicos, que debo conocer?

Hay muchos duplicados ( 1 , 2 , 3 , 4 , 5 ) de esta pregunta, pero fueron contestados hace décadas. Las respuestas muy votadas en muchas de estas preguntas están equivocadas hoy.

Métodos de otros (antiguos QA''s) en .sx

  • stat.h (wrapper sprintstatf ), usa syscall

  • tellg() , devuelve por definición una posición pero no necesariamente bytes . El tipo de retorno no es int .


C ++ 17 trae std::filesystem que agiliza muchas tareas en archivos y directorios. No solo puede obtener rápidamente el tamaño del archivo, sus atributos, sino también crear nuevos directorios, iterar a través de archivos, trabajar con objetos de ruta.

La nueva biblioteca nos da dos funciones que podemos usar:

std::uintmax_t std::filesystem::file_size( const std::filesystem::path& p ); std::uintmax_t std::filesystem::directory_entry::file_size() const;

La primera función es una función libre en std::filesystem , la segunda es un método en directory_entry .

Cada método también tiene una sobrecarga, ya que puede lanzar una excepción o devolver un código de error (a través de un parámetro de salida). A continuación se muestra el código de detalle que explica todos los casos posibles.

#include <chrono> #include <filesystem> #include <iostream> namespace fs = std::filesystem; int main(int argc, char* argv[]) { try { const auto fsize = fs::file_size("a.out"); std::cout << fsize << ''/n''; } catch (const fs::filesystem_error& err) { std::cerr << "filesystem error! " << err.what() << ''/n''; if (!err.path1().empty()) std::cerr << "path1: " << err.path1().string() << ''/n''; if (!err.path2().empty()) std::cerr << "path2: " << err.path2().string() << ''/n''; } catch (const std::exception& ex) { std::cerr << "general exception: " << ex.what() << ''/n''; } // using error_code std::error_code ec{}; auto size = std::filesystem::file_size("a.out", ec); if (ec == std::error_code{}) std::cout << "size: " << size << ''/n''; else std::cout << "error when accessing test file, size is: " << size << " message: " << ec.message() << ''/n''; }


<filesystem> (agregado en C ++ 17) hace que esto sea muy sencillo .

#include <cstdint> #include <filesystem> // ... std::uintmax_t size = std::filesystem::file_size("c://foo//bar.txt");

Como se señaló en los comentarios, si planea usar esta función para decidir cuántos bytes leer del archivo, tenga en cuenta que ...

... a menos que el archivo sea abierto exclusivamente por usted, su tamaño puede cambiarse entre el momento en que lo solicita y el momento en que intenta leer los datos.
- Nicol Bolas