Портативный способ получить размер файла в C / C ++ - PullRequest
8 голосов
/ 11 марта 2010

Мне нужно определить размер файла в байтах.

Язык кодирования - C ++, и код должен работать с Linux, Windows и любой другой операционной системой. Это подразумевает использование стандартных функций или классов C или C ++.

Эта тривиальная потребность, по-видимому, не имеет тривиального решения.

Ответы [ 6 ]

7 голосов
/ 11 марта 2010

Используя поток STD, вы можете использовать:

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

Если вы имеете дело с файлом только для записи (std :: ofstream), то существуют другие методы:

ofile.seekp(0, std::ios_base::end);
ofile.tellp();
6 голосов
/ 11 марта 2010

Вы можете использовать системный вызов stat:

#ifdef WIN32 
_stat64()
#else
stat64()
3 голосов
/ 11 марта 2010

Если вам нужен только размер файла, это определенно излишне, но в целом я бы выбрал Boost.Filesystem для независящих от платформы файловых операций. Среди других функций атрибута он содержит

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

Ссылку можно найти здесь . Хотя библиотеки Boost могут показаться огромными, я обнаружил, что часто они реализуются очень эффективно. Вы также можете извлечь только ту функцию, которая вам нужна, но это может оказаться трудным делом, так как Boost довольно сложен.

0 голосов
/ 30 июля 2010

Переносимость требует, чтобы вы использовали наименее распространенные знаменатели, которые были бы C. (не c ++) Метод, который я использую, следующий:

#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;
}
0 голосов
/ 11 марта 2010

Часто мы хотим добиться максимальной переносимости, но в определенных ситуациях, особенно подобных, я настоятельно рекомендую использовать системные API для лучшей производительности.

0 голосов
/ 11 марта 2010

Simples:

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