gpt4 book ai didi

c++ - 电源故障后 Windows 操作系统中的文件损坏

转载 作者:太空宇宙 更新时间:2023-11-04 14:33:16 25 4
gpt4 key购买 nike

以下操作在我们的应用程序中经常发生,每当发生电源故障时,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

最佳答案

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

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

关于c++ - 电源故障后 Windows 操作系统中的文件损坏,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49236334/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com