public static T ReadBinary <T>(this IConversionSupport conversionSupport, string filePath, ReadingOptions readingOptions) where T : IConversionSupport { if (new FileInfo(filePath).Length > int.MaxValue) { throw new Exception("Input file is too large."); } Stream stream; if (readingOptions.UsesMemoryMapping) { MemoryMappedFile memoryMappedFile = MemoryMappedFile.CreateFromFile(filePath); stream = memoryMappedFile.CreateViewStream(); } else { stream = new MemoryStream(File.ReadAllBytes(filePath)); } using (ArkArchive archive = new ArkArchive(stream)) { conversionSupport.ReadBinary(archive, readingOptions); } return((T)conversionSupport); }
public static void WriteBinary(this IConversionSupport conversionSupport, string filePath, WritingOptions writingOptions) { int size = conversionSupport.CalculateSize(); Stream stream; if (writingOptions.UsesMemoryMapping) { File.Create(filePath).Dispose(); MemoryMappedFile memoryMappedFile = MemoryMappedFile.CreateFromFile(filePath, FileMode.Open, null, size, MemoryMappedFileAccess.Write); stream = memoryMappedFile.CreateViewStream(); } else { stream = new MemoryStream(new byte[size], true); } using (ArkArchive archive = new ArkArchive(stream)) { conversionSupport.WriteBinary(archive, writingOptions); if (!writingOptions.UsesMemoryMapping) { using (FileStream file = File.Create(filePath)) { stream.Position = 0; stream.CopyTo(file); } } } }