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