Pregunta

Necesito determin el tamaño en bytes de un archivo.

El lenguaje de codificación es C ++ y el código debería funcionar con Linux, Windows y otros sistemas operativos. Esto implica el uso estándar de C o C ++ funciones / clases.

Esta necesidad trivial tiene aparentemente sin solución trivial.

¿Fue útil?

Solución

Uso de std flujo que puede utilizar:

std::ifstream ifile(....);
ifile.seekg(0, std::ios_base::end);//seek to end
//now get current position as length of file
ifile.tellg();

Si usted se ocupa de sólo escritura de archivos (std :: ofstream), a continuación, los métodos son otros otra

ofile.seekp(0, std::ios_base::end);
ofile.tellp();

Otros consejos

Puede utilizar la llamada al sistema stat:

#ifdef WIN32 
_stat64()
#else
stat64()

Si sólo necesita el tamaño del archivo este es sin duda una exageración, pero en general me gustaría ir con Boost.Filesystem para las operaciones de archivos independientes de la plataforma. Entre otras funciones de atributos que contiene

template <class Path> uintmax_t file_size(const Path& p);

Puede encontrar el aquí . Aunque las bibliotecas Boost puede parecer enorme Me pareció que para poner en práctica a menudo las cosas de manera muy eficiente. También podría extraer sólo la función que necesita, pero esto podría prueba difícil como Boost es bastante complejo.

Simples:

std::ifstream ifs; 
ifs.open("mybigfile.txt", std::ios::bin); 
ifs.seekg(0, std::ios::end); 
std::fpos pos = ifs.tellg();

A menudo queremos hacer las cosas de la manera más portátil, pero en ciertas situaciones, en especial como este, lo recomiendo encarecidamente el uso del sistema de API para un mejor rendimiento.

Portabilidad requiere el uso de los denominadores menos comunes, lo que sería C. (no c ++) El método que utilizo es el siguiente.

#include <stdio.h>

long filesize(const char *filename)
{
FILE *f = fopen(filename,"rb");  /* open the file in read only */

long size = 0;
  if (fseek(f,0,SEEK_END)==0) /* seek was successful */
      size = ftell(f);
  fclose(f);
  return size;
}
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top