2011-12-30 6 views
0

Я создал под кодом в программе Objective C, чтобы получить размер файла в каталоге, и я должен сделать это на C без использования каких-либо Objective-C методов. Это отлично работает и дает правильный размер при проверке файлов с небольшими размерами. Но когда дело доходит до больших файлов (протестированных с 7-гигабайтным файлом), эта переменная размера возвращает размер файла как 0. Может ли кто-нибудь помочь мне решить эту проблему?Получить размер больших файлов в C возвращает размер как 0

//filePath is a string parameter which takes the path of the file 
    FILE *fp=nil; 
    const char *filePathInToChar = [filePath UTF8String]; 
    fp = fopen(filePathInToChar, "rb"); 
    fseek(fp, 0, SEEK_END); 
    long size = ftell(fp); 

ответ

2

Ваша проблема заключается в том, что ftell возвращает текущее положение в потоке фильтра как long int, которое на 32-битной системе обычно имеет максимальное значение 2^31 - или 2 ГБ, другими словами.

Вы можете использовать stat (так что вы на самом деле не нужно, чтобы открыть и закрыть файл):

#include <sys/stat.h> 

struct stat buf; 
stat(filePathInToChar, &buf); 
off_t size = buf.st_size; 

off_t должен быть long long который обычно 64bit.

+0

thnx это сделало волшебство – user1120633

1

ftello(). Он возвращает off_t, который разрешается до long long под Дарвином.

+0

Спасибо за помощь. Я использовал его как: 'off_t size = ftello (fp);' По-прежнему значение равно нулю. Правильно ли этот код, который я использовал? – user1120633

+0

Проверьте, что 'fp' не является NULL. (И не используйте 'nil', это для типов Objective-C.) –

+0

fp не равно нулю. это подтверждено. – user1120633

0

7GB -> 7516192768 байт

Если long на вашей платформе только 32 бита, максимальное значение он способен удерживать в 2^31 (так как он подписан) -> 2147483648 -> 2 Гб. Даже если вы сделаете его неподписанным, вы сможете отображать только до 4 ГБ. Вам нужно использовать больший тип. long long может поддерживаться вашим компилятором. Попробуйте, это 64-битный и достаточно большой, чтобы сохранить эту ценность. Вы также можете попробовать int64_t в <stdint.h> и посмотреть, поддерживается ли это.

0

Вы проверили, fp является NULL после звонка fopen()?

if (fp) { 
    /* fseek() to SEEK_END and then ftell() to get position */ 
} 
else { 
    fprintf(stderr, "Something went wrong!\n"); 
} 

Обратите внимание, что nil не NULL. Используйте NULL для указателей C.

0

Использование поиска в любом случае не укажет размер файла. В лучшем случае он сообщает вам количество символов в файле, но, скорее всего, он возвращает вам некоторую информацию, которая облегчает поиск. Если вы хотите узнать размер файла, вам нужно прибегнуть к чему-то вроде stat() или некоторой инкапсулированной версии, чтобы сделать его использование проще, например. из библиотеки файловой системы Boost.

Смежные вопросы