Возможно ли реализовать транзакционное сохранение файлов в стандарте 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 (то есть просто стандартную библиотеку или повышение)?
Краткий ответ: нет.
Длинный ответ: стандартные файловые функции поддерживают только довольно базовый набор функций. Если вам нужна определенная функциональность, подобная этой, которая поддерживается только некоторыми операционными системами, то вам нужно будет использовать системные функциональные возможности — или найти другой способ достижения того же результата (например, используя переименование вместо ReplaceFile)
Других решений пока нет …