Как отловить ошибку в FILE IO с помощью C? - PullRequest
1 голос
/ 17 февраля 2012

Я использую следующий фрагмент кода в C для копирования файла:

#define CHUNK 4096 
char buf[CHUNK];
FILE *file , *out;
size_t nread;

file = fopen("test", "rb");
out = fopen("out", "wb");

if (file) {
    while ((nread = fread(buf, 1, sizeof buf, file)) > 0)
        fwrite(buf, 1, nread, out);
    if (ferror(file)) {
        /* Not getting error here */
    }
    fclose(file);
    fclose(out);
}

Мой файл очень большой (200 МБ), я должен обрабатывать ошибки, если файл перемещается или удаляется во время чтения, записив процессе.Как я могу это сделать?

Позвольте мне прояснить это немного, Любой, как я получу доступ к пути с помощью некоторых средств Wi-Fi.Так что, если Wi-Fi будет отключен, то как я получу ошибку ..

Ответы [ 2 ]

2 голосов
/ 17 февраля 2012

Если записанное количество байтов отличается от параметра nread, это указывает на ошибку, поэтому:

if(fwrite(buf, 1, nread, out) != nread) {
  // error handling
}

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

#include <stdio.h>
if (file) {
   // lock file
   _lock_file(file);
   while ((nread = fread(buf, 1, sizeof buf, file)) > 0)
      fwrite(buf, 1, nread, out);
      // unlock the file
      _unlock_file(file);
      fclose(file);
      fclose(out);
}
0 голосов
/ 17 февраля 2012

Вам, вероятно, следует открыть выходной файл в режиме записи, т.е. "wb".

Как обрабатывать ошибки: проверьте возвращаемые значения функций ввода / вывода и попытайтесь устранить ошибки.Вы можете использовать feof() и ferror(), чтобы проанализировать, что пошло не так.Обязательно всегда выполняйте ввод-вывод перед вызовом любого из них (не пытайтесь определить EOF перед чтением).

...