2016-08-10 1 views
0

Le scénario d'utilisation est industriel (alimentation instable et autres programmes/matériels buggés). Il est nécessaire que le programme revienne inchangé lorsque l'alimentation est coupée (ou en cas de panne de l'écran bleu). OS est Windows 7 avec NTFS. J'utilise boost :: property_tree write json pour enregistrer les paramètres dans un fichier texte lisible par un humain. Il a parfois effacé le "logic.txt" parfois, lorsque le système s'arrête. J'ai lu le fichier source boost et appels write_json ofstream avec ios par défaut :: outofstream (mode ios :: out) efface le fichier existant vide lorsque le système s'arrête

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

Le problème doit être ofstream effacer le fichier existant et laisse fichier vide en cas d'échec du système.

Est-ce un problème connu avec ofstream? Quelle est la solution la plus appropriée à cela? Je peux penser à quelques-unes:

  1. fichier Ecrire à « logic_tmp.txt » Tout d'abord, lorsque vous avez terminé, supprimer « logic.txt » et renommer le fichier temporaire à logic.txt.

  2. Utilisation de SQLite au lieu d'écrire directement dans un fichier. (MySQL a cassé une fois, table nécessaire pour être « réparé » quand redémarrera, SQLite ne m'a pas encore échoué)

toute suggestion serait utile.

+0

«Mange mes données: comment tout le monde obtient des erreurs de fichier», voir https://www.flamingspork.com/talks/ (vid mis en cache ici: http://downloads.sehe.nl/zfs-fuse/File_IO_Safety .ogg) – sehe

+0

@sehe Discussion intéressante, je suppose que SQLite multiple (éviter les fichiers volumineux et minimiser la course) avec 'force flush' pourrait être utile. – Guangyu

Répondre

0

La solution simple est votre # 1: écrire dans un fichier temporaire puis renommer. Cependant, notez que pour que le renommer soit atomique, le fichier temporaire doit être sur le même système de fichiers. Le plus sûr serait de simplement le stocker dans le même répertoire. Et bien sûr, vous pouvez utiliser mkstemp() ou similaire pour vous assurer que vous avez un nom de fichier temporaire unique. Ce qui précède n'est toujours pas une garantie à 100% sur tous les systèmes possibles, car cela dépend de la sémantique de votre système de fichiers (vous ne nous avez pas dit quel système de fichiers vous utilisez).

Si vous voulez une solution plus pare-balles, votre # 2 est une bonne idée: utilisez SQLite. Il a été testé dans de nombreux scénarios comme vous l'avez décrit. Voir «

»
+0

Merci pour votre suggestion. Ils fonctionnent sur Windows 7 avec NTFS, pouvez-vous élaborer sur la sémantique du système de fichiers? – Guangyu

+0

Sur NTFS, la solution de tempfile fonctionnera correctement. Pour élaborer: certains systèmes de fichiers tels que FAT sucent et se foirent intrinsèquement sur la perte de puissance, etc. Mais vous n'en utilisez pas un, alors ne vous inquiétez pas à ce sujet. –