以下操作在我们的应用程序中经常发生,每当电源故障发生时,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
答案 0 :(得分:-2)
您需要使用同步IO,这意味着您将不得不使用Windows API而不是FILE
和fopen
。
我没有完成Windows编程n年,但快速谷歌搜索表明你想要使用CreateFile
(我猜的是FILE_FLAG_NO_BUFFERING
和FILE_FLAG_OVERLAPPED
标志,但是这是ctrl + f)。获得文件句柄后,请使用WriteFile