窗口中的文件损坏 电源故障后操作系统

File corruption in windows Opertaing sytem after power failure

本文关键字:故障 操作系统 电源 损坏 文件 窗口      更新时间:2023-10-16

下面的操作在我们的应用程序中非常频繁地发生,每当电源故障发生时.xml都会被损坏,当使用记事本++打开时,我只看到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

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

我已经没有做过Windows编程n年了,但是快速的Google搜索表明您需要使用CreateFile(我猜FILE_FLAG_NO_BUFFERINGFILE_FLAG_OVERLAPPED标志,但这是ctrl + f(。 获得文件句柄后,请使用WriteFile