标准c++中的事务性文件保存

Transactional File Saving in standard C++

本文关键字:文件 保存 事务性 c++ 标准      更新时间:2023-10-16

是否有可能在标准c++中实现事务性文件保存而不使用系统特定的API调用,如CopyFile, ReplaceFile, CreateFile

目前我正在这样做(使用Win32 API特定的代码):

void TransactionalFileSave( const std::wstring& szFileName )
{
      std::wofstream fileTemp( L"temp" );
      for( auto data : vecData )
      {
            fileTemp << data;
      }
      fileTemp.close();
      CloseHandle( CreateFile( szFileName.c_str(), (GENERIC_READ | GENERIC_WRITE), (FILE_SHARE_READ | FILE_SHARE_WRITE), NULL, CREATE_NEW, FILE_ATTRIBUTE_NORMAL, NULL ) );
      CloseHandle( CreateFile( L"temp_backup", GENERIC_ALL, (FILE_SHARE_READ | FILE_SHARE_WRITE), NULL, CREATE_NEW, FILE_ATTRIBUTE_HIDDEN | FILE_ATTRIBUTE_TEMPORARY, NULL ) );
      ReplaceFile( szFileName.c_str(), L"temp", L"temp_backup", REPLACEFILE_WRITE_THROUGH, NULL, NULL );
}

是否有一种方法,我可以实现类似的事情,而不使用Win32 API特定的功能(即只是标准库或boost)?

简短的回答是:不。

长话短说:标准的文件函数只支持一组相当基本的函数。如果您需要像这样的特定功能,只有某些操作系统支持,那么您将需要使用特定于系统的功能—或者找到另一种方法来实现相同的结果(例如,使用rename而不是ReplaceFile)