Если весь ваш код в порядке, вы должны проверить, есть ли какое-либо другое приложение, использующее вашу камеру. Затем вы должны закрыть другое приложение, которое в настоящее время использует вашу камеру.
На основе кода 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;
}
Изменения:
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 для деталей.
Можно открыть файл, перейдите к 0 родственникам смещения от нижней части файла с
#define SEEKBOTTOM 2
fseek(handle, 0, SEEKBOTTOM)
значение, возвращенное от fseek, является размером файла.
Я не кодировал в C в течение долгого времени, но я думаю, что он должен работать.
Быстрый поиск в Google нашел метод с помощью fseek и ftell и поток с этим вопросом с ответами, что в нем нельзя выполнить просто C в другом отношении.
Вы могли пользоваться библиотекой мобильности как NSPR (библиотека, что Firefox полномочий), или проверьте его (довольно волосатую) реализацию.
И если Вы создаете Приложение Windows, используйте GetFileSizeEx API, поскольку файловый ввод-вывод CRT грязен, специально для определения длины файла, из-за особенностей в представлениях файла в различных системах ;)
** Не делайте этого (почему?):
Заключение в кавычки стандартного документа 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
}
Не использовать int
. Файлы более чем 2 гигабайта в размере являются общими как грязь в эти дни
Не использовать unsigned int
. Файлы более чем 4 гигабайта в размере являются общими как немного slightly-less-common грязи
IIRC стандартная библиотека определяет off_t
как неподписанное целое число на 64 бита, которое является тем, что все должны использовать. Мы можем переопределить это, чтобы быть 128 битов через несколько лет, когда мы начинаем иметь бродящие вокруг файлы на 16 эксабайт.
Если Вы находитесь на окнах, необходимо использовать GetFileSizeEx - он на самом деле использует целое число на 64 бита со знаком, таким образом, они начнут поражать проблемы с файлами на 8 эксабайт. Глупая Microsoft!:-)
Решение 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
.
Если Вы соглашаетесь с использованием станд. c библиотека:
#include <sys/stat.h>
off_t fsize(char *file) {
struct stat filestat;
if (stat(file, &filestat) == 0) {
return filestat.st_size;
}
return 0;
}