【发布时间】:2018-08-20 12:55:11
【问题描述】:
以下操作在我们的应用程序中非常频繁地发生,每当发生电源故障时,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
【问题讨论】:
-
你想要什么行为?
-
投资 UPS。
-
问题是我们的软件被我们的一位没有 UPS 的客户使用。我们想要 0 或 1 类似的解决方案,MovefileEx 应该重命名它而没有任何问题,或者它不应该发生(原子)。
-
我不确定您希望我们提供什么帮助在那里(即你不能
try/catch断电)。 -
您需要journaling file system,但确保电源安全会容易得多。
标签: c++ windows file visual-c++