Как определить размер файла в C?

Как узнать размер файла в байтах?

#include 

unsigned int fsize(char* file){
  //what goes here?
}

9X_io

159
1

  • Почему `char * file`, почему не` FILE * f ...
9
Общее количество ответов: 9

Ответ #1

Ответ на вопрос: Как определить размер файла в C?

На основе кода NilObject:

#include 
#include 

off_t fsize(const char *filename) {
    struct stat st; 

    if (stat(filename, &st) == 0)
        return st.st_size;

    return -1; 
}

Изменения:

  • Сделал аргумент имени файла const char.
  • Исправлено определение struct stat, в котором отсутствовало имя переменной.
  • Возвращает -1 при ошибке вместо 0, что было бы неоднозначно для пустого файла. off_t — знаковый тип, поэтому это возможно.

Если 9X_file вы хотите, чтобы fsize() распечатывал сообщение 9X_io об ошибке, вы можете использовать это:

#include 
#include 
#include 
#include 
#include 

off_t fsize(const char *filename) {
    struct stat st;

    if (stat(filename, &st) == 0)
        return st.st_size;

    fprintf(stderr, "Cannot determine size of %s: %s\n",
            filename, strerror(errno));

    return -1;
}

В 9X_input-output 32-битных системах вы должны скомпилировать 9X_file это с опцией -D_FILE_OFFSET_BITS=64, иначе off_t будет содержать только 9X_input-output значения до 2 ГБ. Подробнее см. в разделе 9X_input-output «Использование LFS» в Large File Support in Linux.

168
4

  • * Для более переносимого кода используйте `fseek` +` ftell`, как было предложено Дереком. * Нет. [Стандарт C] (http://www.open-std.org/jtc1/sc22/wg14/www/docs/ n1256.pdf) конкретно ...

Ответ #2

Ответ на вопрос: Как определить размер файла в C?

Не используйте int. Файлы размером более 2 9X_filesize гигабайт в наши дни распространены как грязь

Не 9X_file используйте unsigned int. Файлы размером более 4 гигабайт 9X_c встречаются часто, как немного менее распространенная 9X_c грязь

Стандартная библиотека IIRC определяет 9X_input-output off_t как беззнаковое 64-битное целое число, которое 9X_c следует использовать всем. Мы можем переопределить 9X_filesize это значение до 128 бит через несколько 9X_file лет, когда у нас начнут висеть 16-экзабайтные 9X_io файлы.

Если вы используете Windows, вам следует 9X_file использовать GetFileSizeEx — на самом деле он использует 9X_filesize 64-битное целое число со знаком, поэтому 9X_files они начнут сталкиваться с проблемами с файлами 9X_filesize размером 8 эксабайт. Глупый Майкрософт! :-)

79
2

  • @ JL2210 принятый ответ от Теда Персиваля показывает решение, совместимое с posix, поэт ...

Ответ #3

Ответ на вопрос: Как определить размер файла в C?

Решение Мэтта должно работать, за исключением 9X_io того, что это C++ вместо C, и начальный 9X_c теллс не нужен.

unsigned long fsize(char* file)
{
    FILE * f = fopen(file, "r");
    fseek(f, 0, SEEK_END);
    unsigned long len = (unsigned long)ftell(f);
    fclose(f);
    return len;
}

Вам тоже починили скобу. ;)

Обновление: это 9X_file не лучшее решение. Он ограничен файлами 9X_io размером 4 ГБ в Windows и, вероятно, медленнее, чем 9X_input-output просто вызов для конкретной платформы, такой 9X_filesize как GetFileSizeEx или stat64.

36
2

  • И C99, и C11 возвращают long int из ftell(). Приведение `(unsigned long)` не улучшает диапазон, который уже ограничен функцией. `ftell()` возвращает -1 при ошибке, и это становится запутанным с приведением типо ...

Ответ #4

Ответ на вопрос: Как определить размер файла в C?

**Не делайте этого (why?):

Цитируя стандартный 9X_filesize документ C99, который я нашел в Интернете: «Установка 9X_files индикатора позиции файла на конец файла, как 9X_file и в случае с fseek(file, 0, SEEK_END), имеет неопределенное поведение 9X_input-output для двоичного потока (из-за возможного завершающего 9X_files нулевого символа) или для любого потока 9X_file с кодирование, зависящее от состояния, которое 9X_c не обязательно заканчивается в начальном 9X_filesize состоянии сдвига.**

Измените определение 9X_file на int, чтобы можно было передавать сообщения 9X_input-output об ошибках, а затем используйте fseek() и ftell() для 9X_input-output определения размера файла.

int fsize(char* file) {
  int size;
  FILE* fh;

  fh = fopen(file, "rb"); //binary mode
  if(fh != NULL){
    if( fseek(fh, 0, SEEK_END) ){
      fclose(fh);
      return -1;
    }

    size = ftell(fh);
    fclose(fh);
    return size;
  }

  return -1; //error
}

14
2

  • @mezhaka: Этот отчет CERT просто неверен. `fseeko` и` ftello` (или `fseek` и` ftell`, если вы застряли без первого и довольны ограничениями на размеры файлов, с которыми вы можете ра ...

Ответ #5

Ответ на вопрос: Как определить размер файла в C?

POSIX

Стандарт POSIX имеет собственный метод получения 9X_c размера файла.
Включите заголовок sys/stat.h, чтобы 9X_c использовать функцию.

Сводка

  • Получайте статистику файлов с помощью stat(3).
  • Получите свойство st_size.

Примеры

Примечание. Он ограничивает размер 9X_filesize 4GB. Если не файловая система Fat32, используйте 9X_c 64-битную версию!

#include 
#include 

int main(int argc, char** argv)
{
    struct stat info;
    stat(argv[1], &info);

    // 'st' is an acronym of 'stat'
    printf("%s: size=%ld\n", argv[1], info.st_size);
}
#include 
#include 

int main(int argc, char** argv)
{
    struct stat64 info;
    stat64(argv[1], &info);

    // 'st' is an acronym of 'stat'
    printf("%s: size=%ld\n", argv[1], info.st_size);
}

ANSI C (стандарт)

ANSI C не позволяет напрямую 9X_input-output определять длину файла.
Придется использовать 9X_input-output свой разум. А пока воспользуемся методом 9X_files поиска!

Сводка

  • Найдите файл до конца, используя fseek(3).
  • Получите текущую позицию с помощью ftell(3).

Пример

#include 

int main(int argc, char** argv)
{
    FILE* fp = fopen(argv[1]);
    int f_size;

    fseek(fp, 0, SEEK_END);
    f_size = ftell(fp);
    rewind(fp); // to back to start again

    printf("%s: size=%ld", (unsigned long)f_size);
}

Если это файл stdin или pipe. POSIX, ANSI C не работают.
Он 9X_input-output вернет 0, если файл является конвейером, или 9X_filesize stdin.

Мнение: Вместо этого вам следует использовать 9X_io стандарт POSIX. Потому что он поддерживает 64-битную 9X_c версию.

11
1

  • struct _stat64 и __stat64() для _Windows.<p><span ...

Ответ #6

Ответ на вопрос: Как определить размер файла в C?

Если вас устраивает использование библиотеки 9X_c std c:

#include 
off_t fsize(char *file) {
    struct stat filestat;
    if (stat(file, &filestat) == 0) {
        return filestat.st_size;
    }
    return 0;
}

4
1

  • Это не стандартный C. Это часть стандарта POSIX, но не стандарта ...

Ответ #7

Ответ на вопрос: Как определить размер файла в C?

А если вы создаете приложение для Windows, используйте 9X_io API GetFileSizeEx, так как ввод-вывод файлов CRT запутан, особенно 9X_input-output для определения длины файла из-за особенностей 9X_file представления файлов в разных системах ;)

4
0

Ответ #8

Ответ на вопрос: Как определить размер файла в C?

Нашел a method using fseek and ftell и ветку с этим вопросом с ответами, что 9X_input-output на просто C это нельзя сделать по-другому.

Вы 9X_input-output можете использовать библиотеку переносимости, такую 9X_files ​​как NSPR (библиотека, на которой работает 9X_filesize Firefox).

3
0

Ответ #9

Ответ на вопрос: Как определить размер файла в C?

Я использовал этот набор кода, чтобы определить 9X_filesize длину файла.

//opens a file with a file descriptor
FILE * i_file;
i_file = fopen(source, "r");

//gets a long from the file descriptor for fstat
long f_d = fileno(i_file);
struct stat buffer;
fstat(f_d, &buffer);

//stores file size
long file_length = buffer.st_size;
fclose(i_file);

2
0