Итак, я знаю, что ошибки записи на диск очень редки, поэтому, пожалуйста, просто посмотрите в прошлое, потому что данные, с которыми я работаю, очень невероятно важны (например, такие как SSID). Итак, я хочу скопировать файл абсолютно надежным способом, используя для этого абсолютно минимальный объем памяти. До сих пор это было далеко, как я получил. Это высасывает много памяти, но я не могу найти источник. Он работает, перепроверяя тонны раз, пока не получит подтвержденный результат (это может значительно увеличить количество ложных срабатываний для ошибок, но это может уменьшить вероятность реальной ошибки с большим отрывом). Кроме того, спящий режим внизу позволяет вам проанализировать общую производительность программ с помощью диспетчера задач Windows.
#include <cstdio> // fopen, fclose, fread, fwrite, BUFSIZ
#include <cstdlib>
#include <unistd.h>
#include <iostream>
using namespace std;
__inline__ bool copy_file(const char* From, const char* To)
{
FILE infile = (*fopen(From, "rb"));
FILE outfile = (*fopen(To, "rwb+"));
setvbuf( &infile, nullptr, _IONBF, 0);
setvbuf( &outfile, nullptr, _IONBF, 0);
fseek(&infile,0,SEEK_END);
long int size = ftell(&infile);
fseek(&infile,0,SEEK_SET);
unsigned short error_amount;
bool success;
char c;
char w;
char l;
for ( fpos_t i=0; (i != size); ++i ) {
error_amount=0;
fsetpos( &infile, &i );
c = fgetc(&infile);
fsetpos( &infile, &i );
success=true;
for ( l=0; (l != 126); ++l ) {
fsetpos( &infile, &i );
success = ( success == ( fgetc(&infile)==c ) );
}
while (success==false) {
fsetpos( &infile, &i );
if (error_amount==32767) {
cerr << "There were 32768 failed attemps at accessing a part of the file! exiting the program...";
return false;
}
++error_amount;
//cout << "an error has occured at position ";
//printf("%d in the file.\n", (int)i);
c = fgetc(&infile);
fsetpos( &infile, &i );
success=true;
for ( l=0; (l != 126); ++l ) {
fsetpos( &infile, &i );
success = ( success == ( fgetc(&infile)==c ) );
}
}fsetpos( &infile, &i );
fputc( c, &outfile);
fsetpos( &outfile, &i );error_amount=0;
w = fgetc(&infile);
fsetpos( &outfile, &i );
success=true;
for ( l=0; (l != 126); ++l ) {
fsetpos( &outfile, &i );
success = ( success == ( fgetc(&outfile)==w ) );
}
while (success==false) {
fsetpos( &outfile, &i );
fputc( c, &outfile);
if (error_amount==32767) {
cerr << "There were 32768 failed attemps at writing to a part of the file! exiting the program...";
return false;
}
++error_amount;
w = fgetc(&infile);
fsetpos( &infile, &i );
success=true;
for ( l=0; (l != 126); ++l ) {
fsetpos( &outfile, &i );
success = ( success == ( fgetc(&outfile)==w ) );
}
}
fsetpos( &infile, &i );
}
fclose(&infile);
fclose(&outfile);
return true;
}
int main( void )
{
int CopyResult = copy_file("C:\\Users\\Admin\\Desktop\\example file.txt","C:\\Users\\Admin\\Desktop\\example copy.txt");
std::cout << "Could it copy the file? " << CopyResult << '\n';
sleep(65535);
return 1;
}
Итак, если мой код находится на правильном пути наилучшим образом, то что можно сделать с моим кодом, чтобы улучшить его? Но если мой код полностью отключен с лучшим решением, то какое решение лучше? Обратите внимание, что этот вопрос по существу касается обнаружения редких ошибок записи на диск для приложения копирования очень, очень, очень (и т. Д.) Важных данных.
#include <boost/filesystem.hpp>
#include <iostream>
int main()
{
try
{
boost::filesystem::copy_file( "C:\\Users\\Admin\\Desktop\\example file.txt",
"C:\\Users\\Admin\\Desktop\\example copy.txt" );
}
catch ( boost::filesystem::filesystem_error const & ex )
{
std::cerr << "Copy failed: " << ex.what();
}
}
Это вызовет, пожалуй, наиболее надежную доступную реализацию — ту, которая предоставляется операционной системой — и сообщит о любом сбое.
Моя точка зрения:
Вероятность того, что ваши сохраненные данные в конечном итоге будут повреждены, астрономически мала.
Любое приложение, в котором это может быть проблемой, должно работать в избыточном хранилище, например, RAID-массивах, файловых системах, выполняющих контрольные суммы (например, Btrfs, ZFS) и т. д., снова снижая вероятность отказа существенно.
С другой стороны, выполнение сложных вещей в домашних функциях ввода / вывода, увеличивается вероятность ошибок и / или ложных негативов очень.
Я просто скопировал бы файл без каких-либо специальных проверок, и в конце я бы прочитал файл и сравнил его хеш-значение с ожидаемым. Для хэш-функции я бы использовал MD5 или SHA-1.