2010-03-11 2 views
8

Мне нужно определить размер байта файла.Портативный способ получить размер файла в C/C++

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

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

+0

http://stackoverflow.com/questions/2282549/c-getting-incorrect-file-size/2289423#2289423 –

ответ

8

Использование ЗППП поток вы можете использовать:

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(); 
+4

Откройте файл в двоичном или вы можете получить неверный результат. Например, текст ifstreams мог бы выполнять \ r \ n' на '\ n' перевод. – MSalters

+0

Проблема в том, что tellg() возвращает значение типа streampos. Обычно это int, но это может быть и другой тип. Хотя я сохраню это как ответ. – chmike

+0

Мой ответ на самом деле отражает этот факт, потому что моя первая итерация была от верхней части головы, пока кто-то не указал на ошибку и не заметил меня. –

0

Simples:

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

В 32-битных системах size_t - 32 бита. Таким образом, это не удается с файлами размером 4 ГБ или больше. – user9876

+0

Я написал это с манжетой без ссылки. Глядя на мой код, есть некоторые проблемы, которые я исправил. –

3

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

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

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

6

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

#ifdef WIN32 
_stat64() 
#else 
stat64() 
+1

Стоит отметить, что семейство функций 'stat' является частью POSIX, поэтому они также работают с UNIX и UNIX-подобными системами. –

-1

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

-1

Переносимость требует использования наименее общих знаменателей, которые были бы 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; 
} 
+2

Слишком плохо, если у вас есть файл размером> 2 ГБ на платформах с 32-битным длинным int –

+1

@DavidHeffernan есть 64-битные версии этих функций. но в остальном это требует от вас возможности открыть файл, а также намного медленнее. – chacham15