/// <summary> /// Decrypt from loaded AxCryptDocument to a destination file /// </summary> /// <param name="document">The loaded AxCryptDocument</param> /// <param name="destinationFile">The destination file</param> public static void Decrypt(AxCryptDocument document, IRuntimeFileInfo destinationFile, AxCryptOptions options, ProgressContext progress) { if (document == null) { throw new ArgumentNullException("document"); } if (destinationFile == null) { throw new ArgumentNullException("destinationFile"); } if (progress == null) { throw new ArgumentNullException("progress"); } try { if (OS.Log.IsInfoEnabled) { OS.Log.LogInfo("Decrypting to '{0}'.".InvariantFormat(destinationFile.Name)); } using (Stream destinationStream = destinationFile.OpenWrite()) { document.DecryptTo(destinationStream, progress); } if (OS.Log.IsInfoEnabled) { OS.Log.LogInfo("Decrypted to '{0}'.".InvariantFormat(destinationFile.Name)); } } catch (OperationCanceledException) { if (destinationFile.Exists) { AxCryptFile.Wipe(destinationFile, progress); } throw; } if (options.HasMask(AxCryptOptions.SetFileTimes)) { DocumentHeaders headers = document.DocumentHeaders; destinationFile.SetFileTimes(headers.CreationTimeUtc, headers.LastAccessTimeUtc, headers.LastWriteTimeUtc); } }
public static void WriteToFileWithBackup(IRuntimeFileInfo destinationFileInfo, Action <Stream> writeFileStreamTo, ProgressContext progress) { if (destinationFileInfo == null) { throw new ArgumentNullException("destinationFileInfo"); } if (writeFileStreamTo == null) { throw new ArgumentNullException("writeFileStreamTo"); } string temporaryFilePath = MakeAlternatePath(destinationFileInfo, ".tmp"); IRuntimeFileInfo temporaryFileInfo = OS.Current.FileInfo(temporaryFilePath); try { using (Stream temporaryStream = temporaryFileInfo.OpenWrite()) { writeFileStreamTo(temporaryStream); } } catch (OperationCanceledException) { if (temporaryFileInfo.Exists) { AxCryptFile.Wipe(temporaryFileInfo, progress); } throw; } if (destinationFileInfo.Exists) { string backupFilePath = MakeAlternatePath(destinationFileInfo, ".bak"); IRuntimeFileInfo backupFileInfo = OS.Current.FileInfo(destinationFileInfo.FullName); backupFileInfo.MoveTo(backupFilePath); temporaryFileInfo.MoveTo(destinationFileInfo.FullName); AxCryptFile.Wipe(backupFileInfo, progress); } else { temporaryFileInfo.MoveTo(destinationFileInfo.FullName); } }