2014-11-08 2 views
1

현재 파일에 많은 수의 바이트 쓰기를 처리해야하는 프로젝트가 진행 중입니다. 저수준 C 함수 write(int, const void *, size_t)을 사용합니다. 한 번에 바이트를 많이 처리하기 위해, 나는 시스템에 의해 주어진 것 블록 크기의 블록으로 데이터를 분할 :C 언어로 파일에 블록 단위로 쓰기 처리

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

이 프로젝트는 중요한 데이터를 관리, 그래서 모든 오류를 확인해야합니다. 내 문제는, 내가 글쓰기 과정의 중간에있을 때 어떻게 진행해야 하나의 블록이 에러를 던지게된다는 것이다. 이전 데이터는 이미 파일에 쓰여지고 저수준 C 함수는 "실행 취소"기능과 같은 것을 포함하지 않습니다.

사례의 사례에서 어떻게 진행해야하는지 알고 계십니까?

+0

아마도 그렇게 많이 신경 쓸 필요가 없습니다. 디스크 I/O가 매우 느립니다. CPU. 어떤 데이터를 처리하고 있으며, 파일을 구성하는 방법과 운영 체제 및 파일 시스템을 설명하지는 않습니다. 순차적으로 작성하지 않으면 [sqlite] (http://sqlite.org/), [gdbm] (http://www.gnu.org.ua/software/gdbm/) 또는 데이터베이스를 고려 했습니까? [mongodb] (http://www.mongodb.org/) 또는 [postgresql] (http://postgresql.org/)과 같은 –

+1

사실, 루트 디렉토리'/'를 쓰지 말고, 쓰고있는 파일이 들어있는 디렉토리 (또는 쓰여진 파일 자체)를'stat'해서는 안됩니다. 그들은 아마 다른 파일 시스템에있을 것입니다! –

답변

3

파일에 "추가"(각 새 블록이 이전 블록 다음에 끝나는 경우) 오류가 발생하면 마지막으로 올바른 블록 다음에 파일을자를 수 있습니다.

이전 데이터를 새 데이터로 덮어 쓰는 경우 쓰기위한 임시 파일을 사용하는 것이 유일한 옵션이며 이전 데이터가있는 파일의 이름을 임시 이름 (백업 있음)으로 바꾸면 파일 이름을 new로 바꿉니다 데이터를 "올바른"이름으로 변환하고, 모두 성공하면 이전 데이터의 백업을 삭제합니다.