void RestoreBackup(string destPath, string backup) { if (File.Exists(destPath) && File.Exists(backup)) { File.Delete(destPath); if (backup != null) { File.Move(backup, destPath); if (destPath.Equals(FilePath, StringComparison.InvariantCultureIgnoreCase)) { for (int i = 0; i < Subfiles.Count; i++) { ppSubfile subfile = Subfiles[i] as ppSubfile; /*if ((subfile != null) && subfile.ppPath.Equals(backup, StringComparison.InvariantCultureIgnoreCase)) * { * subfile.ppPath = this.FilePath; * }*/ } } } } }
public static List<IWriteFile> ReadHeader(FileStream stream) { stream.Position = 0; BinaryReader reader = new BinaryReader(stream); byte[] versionHeader = reader.ReadBytes(8); reader.ReadBytes(4); //Version = BitConverter.ToInt32(DecryptHeaderBytes(reader.ReadBytes(4)), 0); TransformHeaderBytes(reader.ReadBytes(1)); // first byte int numFiles = BitConverter.ToInt32(TransformHeaderBytes(reader.ReadBytes(4)), 0); byte[] buf = TransformHeaderBytes(reader.ReadBytes(numFiles * 288)); var subfiles = new List<IWriteFile>(numFiles); for (int i = 0; i < numFiles; i++) { int offset = i * 288; ppSubfile subfile = new ppSubfile(stream.Name); int length = 260; for (int j = 0; j < length; j++) { if (buf[offset + j] == 0x00) { length = j; break; } } subfile.Name = Utility.EncodingShiftJIS.GetString(buf, offset, length); subfile.size = BitConverter.ToUInt32(buf, offset + 260); subfile.offset = BitConverter.ToUInt32(buf, offset + 264); Metadata metadata = new Metadata(); metadata.LastBytes = new byte[20]; System.Array.Copy(buf, offset + 268, metadata.LastBytes, 0, 20); subfile.Metadata = metadata; subfiles.Add(subfile); } return subfiles; }
void writeArchiveWorker_DoWork(object sender, DoWorkEventArgs e) { BackgroundWorker worker = (BackgroundWorker)sender; string backup = null; string dirName = Path.GetDirectoryName(destPath); if (dirName == String.Empty) { dirName = @".\"; } DirectoryInfo dir = new DirectoryInfo(dirName); if (!dir.Exists) { dir.Create(); } if (File.Exists(destPath)) { backup = Utility.GetDestFile(dir, Path.GetFileNameWithoutExtension(destPath) + ".bak", backupExt); File.Move(destPath, backup); if (destPath.Equals(FilePath, StringComparison.InvariantCultureIgnoreCase)) { for (int i = 0; i < Subfiles.Count; i++) { ppSubfile subfile = Subfiles[i] as ppSubfile; /*if ((subfile != null) && subfile.ppPath.Equals(this.FilePath, StringComparison.InvariantCultureIgnoreCase)) * { * subfile.ppPath = backup; * }*/ } } } try { using (BinaryWriter writer = new BinaryWriter(File.Create(destPath))) { writer.BaseStream.Seek(ppHeader_Wakeari.HeaderSize(Subfiles.Count), SeekOrigin.Begin); uint offset = (uint)writer.BaseStream.Position; uint[] sizes = new uint[Subfiles.Count]; object[] metadata = new object[Subfiles.Count]; using (BinaryReader reader = new BinaryReader(File.OpenRead(backup != null ? backup : FilePath))) { for (int i = 0; i < Subfiles.Count; i++) { if (worker.CancellationPending) { e.Cancel = true; break; } worker.ReportProgress(i * 100 / Subfiles.Count); if (Subfiles[i] is ppSubfile subfile) { reader.BaseStream.Seek(subfile.offset, SeekOrigin.Begin); uint readSteps = (uint)(subfile.size / (double)Utility.BufSize); for (int j = 0; j < readSteps; j++) { writer.Write(reader.ReadBytes(Utility.BufSize)); } writer.Write(reader.ReadBytes((int)(subfile.size % Utility.BufSize))); metadata[i] = subfile.Metadata; } else { Stream stream = ppFormat_AA2.WriteStream(writer.BaseStream); Subfiles[i].WriteTo(stream); metadata[i] = ppFormat_AA2.FinishWriteTo(stream); } uint pos = (uint)writer.BaseStream.Position; sizes[i] = pos - offset; offset = pos; } } if (!e.Cancel) { writer.BaseStream.Seek(0, SeekOrigin.Begin); ppHeader_Wakeari.WriteHeader(writer.BaseStream, Subfiles, sizes, metadata); offset = (uint)writer.BaseStream.Position; for (int i = 0; i < Subfiles.Count; i++) { if (Subfiles[i] is ppSubfile subfile) { subfile.offset = offset; subfile.size = sizes[i]; } offset += sizes[i]; } } } if (e.Cancel) { RestoreBackup(destPath, backup); } else { if (destPath.Equals(FilePath, StringComparison.InvariantCultureIgnoreCase)) { for (int i = 0; i < Subfiles.Count; i++) { ppSubfile subfile = Subfiles[i] as ppSubfile; /*if ((subfile != null) && subfile.ppPath.Equals(backup, StringComparison.InvariantCultureIgnoreCase)) * { * subfile.ppPath = this.FilePath; * }*/ } } else { FilePath = destPath; } if ((backup != null) && !keepBackup) { File.Delete(backup); } } } catch { RestoreBackup(destPath, backup); } }