Napisałem program, który kompaktuje dwa małe pliki do jednego większego pliku. Najpierw odczytałem dane z plików wejściowych, scaliłem dane i zapisałem dane wyjściowe do pliku tymczasowego. Po zakończeniu zmieniam nazwę pliku tymczasowego na żądaną nazwę pliku (znajdującą się w tej samej partycji na dysku). Oto pseudo kod:Sprawdź, czy zawartość pliku została faktycznie zapisana na dysku - nie jest w kolejce w buforze kontrolera dysku
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");
}
Wielokrotnie testowałem program z dwoma plikami wejściowymi po 5 MB każdy. Jednorazowo nagle zamknąłem system, odłączając kabel zasilający. Po ponownym uruchomieniu systemu sprawdziłem dane i odkryłem, że pliki wejściowe zostały usunięte, a file_out.dat
wypełnione zerami. To sprawiło, że uwierzyłem, że system spadł zaraz po usunięciu 2 plików wejściowych, a dane wyjściowe wciąż znajdowały się gdzieś w buforze kontrolera dysku. Jeśli to prawda, czy jest jakiś sposób, aby sprawdzić, czy dane rzeczywiście zostały zapisane na dysku?
Widząc, że system operacyjny nawet nie wie na pewno (dysk prawdopodobnie ma własną pamięć podręczną RAM), jest to drażliwy problem. – user4581301