2014-11-08 1 views
1

Я сейчас в проекте, что должно обрабатывать запись большого количества байтов в файл. Я использую низкоуровневую функцию С write(int, const void *, size_t). Для того, чтобы обрабатывать много байт сразу, я разделить данные на блоки размера блока, который задается система:Обрабатывать запись по блоку в файл в C

struct stat b_stat; 
stat("/", &b_stat); 
blksize_t block_size = b_stat.st_blksize; 

Проект управляет важными данными, так что я должен проверить для каждой ошибки. Моя проблема заключается в том, как я должен действовать, когда я нахожусь в середине процесса записи, и один блок вызывает ошибку. Предыдущие данные уже записаны в файл, а низкоуровневые C-функции не включают в себя что-то вроде функции «отменить».

Есть ли у вас какие-либо идеи о том, как я должен действовать в этом примере?

+0

Вы, вероятно, не должны так беспокоиться. Диск ввода/вывода очень медленный w.r.t. ЦПУ. Вы не объясняете, какие данные вы обрабатываете и как организовывается файл, и на какой операционной системе и файловой системе. Если вы не пишете последовательно, вы рассмотрели [sqlite] (http://sqlite.org/) или [gdbm] (http://www.gnu.org.ua/software/gdbm/) или базы данных как [mongodb] (http://www.mongodb.org/) или [postgresql] (http://postgresql.org/)? –

+1

Кстати, вы не должны «ставить» корневой каталог '/', но каталог, в котором находится файл, который вы пишете (или сам файл записи). Вероятно, они будут в разных файловых системах! –

ответ

3

Если вы «добавляете» к файлу (каждый новый блок заканчивается после предыдущего), вы можете обрезать файл после последнего правильного блока в случае ошибки.

Если вы переписываете старые данные новыми данными, единственным вариантом является использование временного файла для записи, и если вам удастся переименовать файл со старыми данными в какое-то временное имя (чтобы иметь резервную копию), переименуйте файл с новым данных на «правильное» имя, и если все это удастся, вы удалите резервную копию старых данных.