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

Если весь ваш код в порядке, вы должны проверить, есть ли какое-либо другое приложение, использующее вашу камеру. Затем вы должны закрыть другое приложение, которое в настоящее время использует вашу камеру.

132
задан hippietrail 5 April 2011 в 00:08
поделиться

8 ответов

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

#include <sys/stat.h>
#include <sys/types.h>

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

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

    return -1; 
}

Изменения:

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

Если Вы хотите fsize() для печати сообщения на ошибке можно использовать это:

#include <sys/stat.h>
#include <sys/types.h>
#include <string.h>
#include <stdio.h>
#include <errno.h>

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;
}

В 32-разрядных системах необходимо скомпилировать это с опцией -D_FILE_OFFSET_BITS=64, иначе off_t будет только содержать значения до 2 ГБ. Посмотрите раздел "Using LFS" Большой Поддержки Файла в Linux для деталей.

137
ответ дан 24 November 2019 в 00:09
поделиться

Можно открыть файл, перейдите к 0 родственникам смещения от нижней части файла с

#define SEEKBOTTOM   2

fseek(handle, 0, SEEKBOTTOM)  

значение, возвращенное от fseek, является размером файла.

Я не кодировал в C в течение долгого времени, но я думаю, что он должен работать.

-3
ответ дан 24 November 2019 в 00:09
поделиться

Быстрый поиск в Google нашел метод с помощью fseek и ftell и поток с этим вопросом с ответами, что в нем нельзя выполнить просто C в другом отношении.

Вы могли пользоваться библиотекой мобильности как NSPR (библиотека, что Firefox полномочий), или проверьте его (довольно волосатую) реализацию.

3
ответ дан 24 November 2019 в 00:09
поделиться

И если Вы создаете Приложение Windows, используйте GetFileSizeEx API, поскольку файловый ввод-вывод CRT грязен, специально для определения длины файла, из-за особенностей в представлениях файла в различных системах ;)

5
ответ дан 24 November 2019 в 00:09
поделиться

** Не делайте этого (почему?):

Заключение в кавычки стандартного документа C99, который я нашел онлайн: "Устанавливая индикатор позиции в файле на конец файла, как с fseek(file, 0, SEEK_END), имеет неопределенное поведение для двоичного потока (из-за возможных запаздывающих нулевых символов) или для любого потока с зависимым состояния, кодирующим, который конечно не заканчивается в начальном состоянии сдвига. **

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

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
ответ дан 24 November 2019 в 00:09
поделиться

Не использовать int. Файлы более чем 2 гигабайта в размере являются общими как грязь в эти дни

Не использовать unsigned int. Файлы более чем 4 гигабайта в размере являются общими как немного slightly-less-common грязи

IIRC стандартная библиотека определяет off_t как неподписанное целое число на 64 бита, которое является тем, что все должны использовать. Мы можем переопределить это, чтобы быть 128 битов через несколько лет, когда мы начинаем иметь бродящие вокруг файлы на 16 эксабайт.

Если Вы находитесь на окнах, необходимо использовать GetFileSizeEx - он на самом деле использует целое число на 64 бита со знаком, таким образом, они начнут поражать проблемы с файлами на 8 эксабайт. Глупая Microsoft!:-)

73
ответ дан 24 November 2019 в 00:09
поделиться

Решение Matt должно работать, за исключением того, что это - C++ вместо 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;
}

Зафиксированный Ваша фигурная скобка для Вас, также.;)

Обновление: Это не действительно лучшее решение. Это ограничено файлами на 4 ГБ в Windows, и это, вероятно, медленнее, чем просто использование определенного для платформы вызова как GetFileSizeEx или stat64.

30
ответ дан 24 November 2019 в 00:09
поделиться

Если Вы соглашаетесь с использованием станд. c библиотека:

#include <sys/stat.h>
off_t fsize(char *file) {
    struct stat filestat;
    if (stat(file, &filestat) == 0) {
        return filestat.st_size;
    }
    return 0;
}
5
ответ дан 24 November 2019 в 00:09
поделиться
Другие вопросы по тегам:

Похожие вопросы: