【问题标题】:File corruption in windows Opertaing sytem after power failure断电后Windows操作系统中的文件损坏
【发布时间】: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++


【解决方案1】:

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

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

【讨论】:

    猜你喜欢
    • 2014-09-23
    • 2012-07-30
    • 2010-11-29
    • 1970-01-01
    • 1970-01-01
    • 2020-01-23
    • 1970-01-01
    • 1970-01-01
    • 2015-04-16
    相关资源
    最近更新 更多