J'ai écrit un programme qui compacte deux petits fichiers dans un seul fichier plus gros. Je lis d'abord les données des fichiers d'entrée, fusionne les données et écrit la sortie dans un fichier temporaire. Une fois cela terminé, je renommer le fichier temporaire au nom de fichier désiré (situé dans la même partition sur le disque). Voici le pseudo code:Vérifie si le contenu du fichier a bien été écrit sur le disque - n'étant pas mis en file d'attente dans le tampon du contrôleur de disque
FILE* fp_1 = fopen("file_1.dat", "r+b");
FILE* fp_2 = fopen("file_2.dat", "r+b");
FILE* fp_out = fopen("file_tmp.dat", "w+b");
// 1. Read data for the key in two files
const char* data_1 = ...;
const char* data_2 = ...;
// 2. Merge data, store in an allocated buffer
// 3. Write merged buffer to temp file
fwrite(temp_buff, estimated_size, 1, fp_out);
fflush(fp_out);
fclose(fp_1);
fclose(fp_2);
fclose(fp_out);
// Now rename temp file to desired file name
if(std::rename("file_tmp.dat", "file_out.dat") == 0)
{
std::remove("file_1.dat");
std::remove("file_2.dat");
}
J'ai testé à plusieurs reprises le programme avec deux fichiers d'entrée de 5 Mo chacun. Une fois, j'ai soudainement éteint le système en débranchant le câble d'alimentation. Après avoir redémarré le système, j'ai vérifié les données et trouvé que les fichiers d'entrée ont été supprimés et le file_out.dat
a été rempli avec tous les zéros. Cela m'a fait croire que le système est tombé juste après que 2 fichiers d'entrée ont été supprimés et les données de sortie étaient encore quelque part dans le tampon du contrôleur de disque. Si cela est vrai, alors est-il possible de vérifier si les données ont réellement été écrites sur le disque?
Voyant que le système d'exploitation ne sait même pas avec certitude (le disque a probablement son propre cache RAM) c'est un problème épineux. – user4581301