public void BsDiffCreateFromStreams() { const int outputSize = 0x2A000; foreach (var oldBuffer in GetBuffers(Sizes)) { foreach (var newBuffer in GetBuffers(Sizes)) { byte[] bytesOut; using (var mmf = MemoryMappedFile.CreateNew(null, outputSize, MemoryMappedFileAccess.ReadWrite)) { using (var mmfStream = mmf.CreateViewStream()) { BsDiff.Create(oldBuffer, newBuffer, mmfStream); } using (var msA = new MemoryStream(oldBuffer)) using (var msOutput = new MemoryStream()) { BsPatch.Apply(msA, mmf.CreateViewStream, msOutput); bytesOut = msOutput.ToArray(); } } Assert.Equal(newBuffer, bytesOut); } } }
private void ApplyPatch(string srcName, PatchedFile file, PC98FatFileSystem srcFat, FatFileSystem dstFat) { if (srcName.EndsWith("CRUISER.COM")) { var dir = System.IO.Path.GetDirectoryName(Application.ExecutablePath); var name = Path.Combine(dir, srcName.TrimStart('\\')); using (var src = srcFat.OpenFile(srcName, FileMode.Open)) { using (var dst = File.Create(name)) { src.CopyTo(dst); } } using (var dst = File.Create(name + ".patch")) { dst.Write(file.Patch, 0, file.Patch.Length); } } MakeDirectory(file.Name, dstFat); using (var ms = new MemoryStream(file.Patch)) { ms.Position = 0; using (var src = srcFat.OpenFile(srcName, FileMode.Open)) { using (var dst = dstFat.OpenFile(file.Name, FileMode.Create)) { BsPatch.Apply(src, file.Patch, dst); } } } }
public byte[] ApplyDelta5() { using (var outputStream = new MemoryStream()) { BsPatch.Apply(Samples.origin5, sample5Delta, outputStream); return(outputStream.ToArray()); } }
private static byte[] BsDiffApply(byte[] oldBuffer, byte[] patchBuffer) { using (var outputStream = new MemoryStream()) { BsPatch.Apply(oldBuffer, patchBuffer, outputStream); return(outputStream.ToArray()); } }
private static void ApplyPatch(string src, string patch, string dst) { if (File.Exists(dst)) { File.Delete(dst); } using (var fh = File.Create(dst)) { BsPatch.Apply(File.ReadAllBytes(src), File.ReadAllBytes(patch), fh); } }
public void BsPatchFlushesOutput() { var oldBuffer = GetRandomFilledBuffer(0x123); var newBuffer = GetRandomFilledBuffer(0x4567); //can't use MemoryStream directly as Flush has no effect var patchMs = new MemoryStream(); var wrappedPatchMs = new BufferedStream(patchMs); BsDiff.Create(oldBuffer, newBuffer, wrappedPatchMs); var patchBuffer = patchMs.ToArray(); var reconstructMs = new MemoryStream(); var wrappedReconstructMs = new BufferedStream(reconstructMs); BsPatch.Apply(oldBuffer, patchBuffer, wrappedReconstructMs); var reconstructedBuffer = reconstructMs.ToArray(); Assert.Equal(newBuffer, reconstructedBuffer); }
public static void Patch(string patchFile, string localFile) { BsPatch.Apply(localFile, patchFile); }
public void Apply(string source, string dest) { if (source != dest) { Console.WriteLine("Copying Unchanged Files..."); //if our destination folder is different, //copy unchanged files first. var sourceFiles = new HashSet <string>(); RecursiveDirectoryScan(source, sourceFiles, source); sourceFiles.ExceptWith(new HashSet <string>(Patches.Select(x => x.FileTarget))); sourceFiles.ExceptWith(new HashSet <string>(Deletions)); foreach (var file in sourceFiles) { var destP = Path.Combine(dest, file); Directory.CreateDirectory(Path.GetDirectoryName(destP)); File.Copy(Path.Combine(source, file), destP); } Console.WriteLine("Done!"); } var reader = new BinaryReader(Str); foreach (var patch in Patches) { Console.WriteLine($"Patching {patch.FileTarget}..."); var path = Path.Combine(source, patch.FileTarget); var dpath = Path.Combine(dest, patch.FileTarget); var data = File.ReadAllBytes(path); Directory.CreateDirectory(Path.GetDirectoryName(dpath)); Str.Seek(patch.Offset, SeekOrigin.Begin); var patchd = reader.ReadBytes(patch.Length); BsPatch.Apply(data, patchd, File.Open(dpath, FileMode.Create, FileAccess.Write, FileShare.None)); } Console.WriteLine("Patching Complete!"); foreach (var add in Additions) { Console.WriteLine($"Adding File {add.FileTarget}..."); var dpath = Path.Combine(dest, add.FileTarget); Directory.CreateDirectory(Path.GetDirectoryName(dpath)); Str.Seek(add.Offset, SeekOrigin.Begin); var addData = reader.ReadBytes(add.Length); File.WriteAllBytes(dpath, addData); } foreach (var del in Deletions) { try { File.Delete(Path.Combine(dest, del)); Console.WriteLine($"Deleted {del}."); } catch { //file not found. not important - we wanted it deleted anyways. } } }