电源故障后,Windows Opertaing系统中的文件损坏

时间:2018-03-12 13:22:06

标签: c++ windows file visual-c++

以下操作在我们的应用程序中经常发生,每当电源故障发生时,dest.xml将被破坏,并且我在使用Notepad ++打开时只看到NULNULNULNULNUL。我尝试过禁用缓存并使用remove()和rename()的组合将src.xml.ignore重命名为dest.xml。仍然是同一个问题。在电源故障期间有没有办法解决这个问题

MemoryOutputStream file;
file << dir << '\\' << relPath << idToUse << ".xml.ignore";
CSString temp = file.AsString(); /* CSString is our  internalstring class it can be converted into const char* */
FileUtils::MakeDirsInFilePath( temp );

static const int NUM_RETRIES = 50;
static const int WAIT_AMT = 100;

int i;
for ( i = 0; i < NUM_RETRIES; ++i )
{
    FILE * fp = ::_fsopen( temp, "wb", _SH_DENYRW );
    if ( fp != 0 )
    {
        FileOutputStream fos( fp, true );
        fos << xml;
        if ( fos.Close() )
        {
            break;
        }

        FileUtils::Delete( temp );
    }
    Thread::SleepFor( WAIT_AMT );
}
if ( i == NUM_RETRIES )
{
    return false;
}

// move into place
//
file.Reset();
file << dir << '\\' << idToUse << ".xml";
CSString dest = file.AsString();

DWORD flags = MOVEFILE_COPY_ALLOWED|MOVEFILE_WRITE_THROUGH;
if (overwrite) flags |= MOVEFILE_REPLACE_EXISTING;
BOOL rc = ::MoveFileEx( src, dest, flags ); ///Dest file is getting corrupted

1 个答案:

答案 0 :(得分:-2)

您需要使用同步IO,这意味着您将不得不使用Windows API而不是FILEfopen

我没有完成Windows编程n年,但快速谷歌搜索表明你想要使用CreateFile(我猜的是FILE_FLAG_NO_BUFFERINGFILE_FLAG_OVERLAPPED标志,但是这是ctrl + f)。获得文件句柄后,请使用WriteFile