2016-08-10 8 views
0

사용 시나리오는 산업 (불안정한 전원 공급 장치 및 기타 버그가 많은 프로그램/하드웨어)입니다. 전원이 꺼지면 (또는 블루 스크린 충돌) 프로그램이 영향을받지 않아야합니다. OS는 NTFS를 사용하는 Windows 7입니다.ofstream (모드 ios :: out)은 시스템이 중단 될 때 기존 파일을 지워줍니다.

boost :: property_tree write json을 사용하여 사람이 읽을 수있는 텍스트 파일에 매개 변수를 기록합니다.

boost::property_tree::write_json("logic.txt", pt); 

실제로 시스템이 중단 될 때 "logic.txt"가 지워지는 경우가 있습니다. 나는 부스트 소스 파일을 읽고 write_json 통화는 기본 IOS와 ofstream :: 밖으로

std::basic_ofstream<typename Ptree::key_type::value_type> stream(filename.c_str());   

문제는 기존 파일을 닦아 ofstream하고 시스템이 실패 할 때 빈 파일을 둡니다한다.

ofstream의 알려진 문제입니까? 이것에 가장 적합한 해결책은 무엇입니까? 나는 몇 가지 생각할 수 : 완료되면 "logic_tmp.txt는"첫째, 삭제 "logic.txt"와 logic.txt 할 수있는 임시 파일의 이름을 변경하는

  1. 쓰기 파일을.

  2. 직접 파일에 쓰는 대신 SQLite를 사용하십시오. (MySQL은 몇 번 깨고, 다시 시작할 때 테이블을 "복구"해야합니다. SQLite는 아직 나를 실패하지 않았습니다.)

어떤 제안이 도움이 될 것입니다.

+0

"내 데이터를 먹어 모두가 파일 IO를 잘못 가져 오는 방법"https://www.flamingspork.com/talks/ (여기에 캐시 됨 : http://downloads.sehe.nl/zfs-fuse/File_IO_Safety)를 참조하십시오. .gog) – sehe

+0

@sehe 흥미로운 이야기, 나는 많은 SQLite (큰 파일을 피하고 경주를 최소화)를 'force flush'로 가정하면 도움이 될 수 있습니다. – Guangyu

답변

0

간단한 해결책은 # 1 : 임시 파일에 쓰고 이름을 바꾸는 것입니다. 그러나 이름이 원자 일 때 임시 파일은 같은 파일 시스템에 있어야합니다. 가장 안전한 방법은 단순히 같은 디렉토리에 저장하는 것입니다. 물론 mkstemp() 또는 이와 유사한 파일을 사용하여 고유 한 임시 파일 이름을 사용할 수 있습니다.

위의 내용은 파일 시스템 의미론 (사용중인 파일 시스템을 알려주지 않았 음)에 따라 다르므로 가능한 모든 시스템에서 100 % 보증되지는 않습니다.

방탄 솔루션을 더 원하면 # 2를 사용하는 것이 좋습니다. SQLite를 사용하십시오. 당신이 설명하는 것처럼 많은 시나리오에서 테스트되었습니다. https://www.sqlite.org/testing.html

+0

제안 해 주셔서 감사합니다. 이 시스템은 Windows 7에서 NTFS로 실행되며 파일 시스템 의미론을 상세히 설명 할 수 있습니까? – Guangyu

+0

NTFS에서는 임시 파일 솔루션이 정상적으로 작동합니다. 정교하기 : FAT와 같은 일부 파일 시스템은 전력 손실 등의 경우에 본질적으로 엉망이됩니다.하지만 그 중 하나를 사용하지 않으므로 걱정하지 마십시오. –