private static async Task ExtractArchiveSync(string headerFile, string dataFile, string destinationPath) { using (MS2Archive archive = await MS2Archive.Load(headerFile, dataFile).ConfigureAwait(false)) { List <MS2File> files = archive.Files; for (int i = 0; i < files.Count; i++) { MS2File file = files[i]; Logger.Info($"Extracting file \"{file.Name}\", \"{FileEx.FormatStorage(file.Header.Size)}\". ({file.Header.Id}/{files.Count})"); await ExtractFileAsync(destinationPath, file).ConfigureAwait(false); } } }
private static async Task ExportArchiveAsync(string headerFile, string dataFile, string destinationFilePath) { using (var swExport = new StreamWriter(destinationFilePath)) using (MS2Archive archive = await MS2Archive.Load(headerFile, dataFile).ConfigureAwait(false)) { List <MS2File> files = archive.Files; for (int i = 0; i < files.Count; i++) { MS2File file = files[i]; Logger.Info($"Exporting file \"{file.Name}\". ({file.Header.Id}/{files.Count})"); await ExportFileAsync(swExport, file).ConfigureAwait(false); } } }
public async Task TestCreateConsistencyMS2F() { const string archiveName = "PrecomputedTerrain"; const string folderToArchive = @"C:\Users\Miyu\Desktop\ReleaseOutput\Resource\" + archiveName; string folderToArchiveFullPath = Path.GetFullPath(folderToArchive) + @"\"; string[] filesToArchive = Directory.GetFiles(folderToArchive, "*.*", SearchOption.AllDirectories).Select(p => Path.GetFullPath(p)).ToArray(); const string headerFilePath = @"..\TestData\PrecomputedTerrain.m2h"; const string dataFilePath = @"..\TestData\PrecomputedTerrain.m2d"; MS2CryptoMode archiveCryptoMode = MS2CryptoMode.MS2F; MS2File[] files = new MS2File[filesToArchive.Length]; for (int i = 0; i < filesToArchive.Length; i++) { string file = filesToArchive[i]; files[i] = MS2File.Create((uint)i + 1u, file.Remove(folderToArchiveFullPath), CompressionType.Zlib, archiveCryptoMode, file); } const string testArchiveName = "FromExtractedMS2F"; const string headerTestFileName = testArchiveName + ".m2h"; const string dataTestFileName = testArchiveName + ".m2d"; try { await MS2Archive.Save(archiveCryptoMode, files, headerTestFileName, dataTestFileName, RunMode.Async2).ConfigureAwait(false); Assert.IsTrue(File.Exists(headerTestFileName)); Assert.IsTrue(File.Exists(dataTestFileName)); using (MS2Archive archive = await MS2Archive.Load(headerFilePath, dataFilePath).ConfigureAwait(false)) { Dictionary <uint, MS2File> mappedFiles = archive.Files.Zip(files, (o, s) => (o, s)) .ToDictionary(f => f.o.Id, f => files.Where(sf => sf.Name == f.o.Name).First()); Assert.AreEqual(archive.CryptoMode, archiveCryptoMode); Assert.AreEqual(archive.Files.Count, filesToArchive.Length); //Assert.AreEqual(archive.Name, ArchiveName); Task[] tasks = new Task[filesToArchive.Length]; for (int i = 0; i < filesToArchive.Length; i++) { int ic = i; tasks[ic] = Task.Run(async() => { MS2File file = archive.Files[ic]; MS2File savedFile = mappedFiles[file.Id]; var(savedStream, savedShouldDispose) = await savedFile.GetDecryptedStreamAsync().ConfigureAwait(false); try { Assert.AreEqual(file.Id, (uint)ic + 1); Assert.AreEqual(file.CompressionType, CompressionType.Zlib); Assert.IsTrue(file.IsZlibCompressed); Assert.AreEqual(file.Name, savedFile.Name); Assert.AreEqual(file.Header.CompressionType, file.CompressionType); Assert.AreEqual(file.Header.Size, (uint)savedStream.Length); (Stream stream, bool shouldDispose) = await file.GetDecryptedStreamAsync().ConfigureAwait(false); try { byte[] savedBytes = new byte[savedStream.Length]; byte[] originalBytes = new byte[stream.Length]; int savedReadBytes = await savedStream.ReadAsync(savedBytes, 0, savedBytes.Length).ConfigureAwait(false); int originalReadBytes = await stream.ReadAsync(originalBytes, 0, originalBytes.Length).ConfigureAwait(false); Assert.AreEqual(originalReadBytes, savedReadBytes); CollectionAssert.AreEqual(originalBytes, savedBytes); } finally { if (shouldDispose) { stream.Dispose(); } } } finally { if (savedShouldDispose) { savedStream.Dispose(); } } }); } await Task.WhenAll(tasks).ConfigureAwait(false); } } finally { File.Delete(headerTestFileName); File.Delete(dataTestFileName); } }
public async Task TestCreateCompletelyNewNS2F() { const string folderForArchiving = "TestFolderForArchiving"; string folderToArchive = Path.Combine(@"..\TestData", folderForArchiving); string folderToArchiveFullPath = Path.GetFullPath(folderToArchive) + @"\"; string[] filesToArchive = Directory.GetFiles(folderToArchive, "*.*", SearchOption.AllDirectories).Select(p => Path.GetFullPath(p)).ToArray(); MS2CryptoMode cryptoMode = MS2CryptoMode.NS2F; MS2File[] files = new MS2File[filesToArchive.Length]; for (int i = 0; i < filesToArchive.Length; i++) { string file = filesToArchive[i]; files[i] = MS2File.Create((uint)i + 1u, file.Remove(folderToArchiveFullPath), CompressionType.Zlib, cryptoMode, file); } const string testArchiveName = "TestArchiveNS2F"; const string headerTestFileName = testArchiveName + ".m2h"; const string dataTestFileName = testArchiveName + ".m2d"; try { await MS2Archive.Save(cryptoMode, files, headerTestFileName, dataTestFileName, RunMode.Async2).ConfigureAwait(false); Assert.IsTrue(File.Exists(headerTestFileName)); Assert.IsTrue(File.Exists(dataTestFileName)); using (MS2Archive archive = await MS2Archive.Load(headerTestFileName, dataTestFileName).ConfigureAwait(false)) { Assert.AreEqual(archive.CryptoMode, cryptoMode); Assert.AreEqual(archive.Files.Count, filesToArchive.Length); //Assert.AreEqual(archive.Name, ArchiveFolder); for (int i = 0; i < filesToArchive.Length; i++) { FileStream fsFile = File.OpenRead(filesToArchive[i]); MS2File file = archive.Files[i]; Assert.AreEqual(file.Id, (uint)i + 1); Assert.AreEqual(file.CompressionType, CompressionType.Zlib); Assert.IsTrue(file.IsZlibCompressed); Assert.AreEqual(file.Name, filesToArchive[i].Remove(folderToArchiveFullPath)); Assert.AreEqual(file.Header.CompressionType, file.CompressionType); Assert.AreEqual(file.Header.Size, (uint)fsFile.Length); (Stream stream, bool shouldDispose) = await file.GetDecryptedStreamAsync().ConfigureAwait(false); try { byte[] originalBytes = new byte[fsFile.Length]; byte[] savedBytes = new byte[stream.Length]; int originalReadBytes = await fsFile.ReadAsync(originalBytes, 0, originalBytes.Length).ConfigureAwait(false); int savedReadBytes = await stream.ReadAsync(savedBytes, 0, savedBytes.Length).ConfigureAwait(false); Assert.AreEqual(originalReadBytes, savedReadBytes); CollectionAssert.AreEqual(originalBytes, savedBytes); } finally { if (shouldDispose) { stream.Dispose(); } } } } } finally { File.Delete(headerTestFileName); File.Delete(dataTestFileName); } }
public async Task AddingMS2F() { const string headerFilePath = @"..\TestData\PrecomputedTerrain.m2h"; const string dataFilePath = @"..\TestData\PrecomputedTerrain.m2d"; using (MS2Archive archive = await MS2Archive.Load(headerFilePath, dataFilePath).ConfigureAwait(false)) { AddRandomFilesToArchive(archive); const string testArchiveName = "AddingTestMS2F"; const string headerTestFileName = testArchiveName + ".m2h"; const string dataTestFileName = testArchiveName + ".m2d"; try { await archive.Save(headerTestFileName, dataTestFileName, RunMode.Async2).ConfigureAwait(false); using (MS2Archive testArchive = await MS2Archive.Load(headerTestFileName, dataTestFileName).ConfigureAwait(false)) { Assert.AreEqual(archive.CryptoMode, testArchive.CryptoMode); Assert.AreEqual(archive.Files.Count, testArchive.Files.Count); Assert.AreNotEqual(archive.Header.Size, testArchive.Header.Size); Assert.AreNotEqual(archive.Data.Size, testArchive.Data.Size); for (int i = 0; i < testArchive.Files.Count; i++) { Assert.AreEqual(archive.Files[i].IsZlibCompressed, testArchive.Files[i].IsZlibCompressed); Assert.AreEqual(archive.Files[i].CompressionType, testArchive.Files[i].CompressionType); Assert.AreEqual(archive.Files[i].InfoHeader.Id, testArchive.Files[i].InfoHeader.Id); Assert.AreEqual(archive.Files[i].InfoHeader.Name, testArchive.Files[i].InfoHeader.Name); Assert.AreEqual(archive.Files[i].InfoHeader.RootFolderId, testArchive.Files[i].InfoHeader.RootFolderId); (Stream Stream, bool ShouldDispose)original = await archive.Files[i].GetDecryptedStreamAsync().ConfigureAwait(false); (Stream Stream, bool ShouldDispose)saved = await testArchive.Files[i].GetDecryptedStreamAsync().ConfigureAwait(false); try { if (archive.Files[i].Header != null && testArchive.Files[i].Header != null) { Assert.AreEqual(archive.Files[i].Header.Size, testArchive.Files[i].Header.Size); } else if (archive.Files[i].Header != null) { Assert.AreEqual(archive.Files[i].Header.Size, saved.Stream.Length); } else if (testArchive.Files[i].Header != null) { Assert.AreEqual(original.Stream.Length, testArchive.Files[i].Header.Size); } Assert.AreEqual(original.Stream.Length, saved.Stream.Length); byte[] originalBytes = new byte[original.Stream.Length]; byte[] savedBytes = new byte[saved.Stream.Length]; int originalReadBytes = await original.Stream.ReadAsync(originalBytes, 0, originalBytes.Length).ConfigureAwait(false); int savedReadBytes = await saved.Stream.ReadAsync(savedBytes, 0, savedBytes.Length).ConfigureAwait(false); Assert.AreEqual(originalReadBytes, savedReadBytes); CollectionAssert.AreEqual(originalBytes, savedBytes); } finally { if (original.ShouldDispose) { original.Stream.Dispose(); } if (saved.ShouldDispose) { saved.Stream.Dispose(); } } } } } finally { File.Delete(headerTestFileName); File.Delete(dataTestFileName); } } }
public async Task LoadThenSaveTestSyncNS2F() { const string headerFilePath = @"..\TestData\Xml.m2h"; const string dataFilePath = @"..\TestData\Xml.m2d"; MS2CryptoMode archiveCryptoMode = MS2CryptoMode.NS2F; using (MS2Archive archive = await MS2Archive.Load(headerFilePath, dataFilePath).ConfigureAwait(false)) { Assert.AreEqual(archive.CryptoMode, archiveCryptoMode); Assert.AreEqual(archive.Files.Count, 66107); Assert.AreEqual(archive.Header, new MS2SizeHeader(502536u, 376900u, 3314723u)); Assert.AreEqual(archive.Data, new MS2SizeHeader(776208u, 582154u, 2379852u)); const string testArchiveName = "SyncSaveTestNS2F"; const string headerTestFileName = testArchiveName + ".m2h"; const string dataTestFileName = testArchiveName + ".m2d"; try { await archive.Save(headerTestFileName, dataTestFileName, RunMode.Sync).ConfigureAwait(false); using (MS2Archive testArchive = await MS2Archive.Load(headerTestFileName, dataTestFileName).ConfigureAwait(false)) { Assert.AreEqual(archive.CryptoMode, testArchive.CryptoMode); Assert.AreEqual(archive.Files.Count, testArchive.Files.Count); Assert.AreEqual(archive.Header.Size, testArchive.Header.Size); Assert.AreEqual(archive.Data.Size, testArchive.Data.Size); for (int i = 0; i < testArchive.Files.Count; i++) { Assert.AreEqual(archive.Files[i].IsZlibCompressed, testArchive.Files[i].IsZlibCompressed); Assert.AreEqual(archive.Files[i].CompressionType, testArchive.Files[i].CompressionType); Assert.AreEqual(archive.Files[i].Header?.Size, testArchive.Files[i].Header?.Size); Assert.AreEqual(archive.Files[i].InfoHeader.Id, testArchive.Files[i].InfoHeader.Id); Assert.AreEqual(archive.Files[i].InfoHeader.Name, testArchive.Files[i].InfoHeader.Name); Assert.AreEqual(archive.Files[i].InfoHeader.RootFolderId, testArchive.Files[i].InfoHeader.RootFolderId); (Stream Stream, bool ShouldDispose, MS2SizeHeader Header)original = await archive.Files[i].GetEncryptedStreamAsync().ConfigureAwait(false); (Stream Stream, bool ShouldDispose, MS2SizeHeader Header)saved = await testArchive.Files[i].GetEncryptedStreamAsync().ConfigureAwait(false); try { Assert.AreEqual(original.Header.Size, saved.Header.Size); Assert.AreEqual(original.Stream.Length, saved.Stream.Length); byte[] originalBytes = new byte[original.Stream.Length]; byte[] savedBytes = new byte[saved.Stream.Length]; int originalReadBytes = await original.Stream.ReadAsync(originalBytes, 0, originalBytes.Length).ConfigureAwait(false); int savedReadBytes = await saved.Stream.ReadAsync(savedBytes, 0, savedBytes.Length).ConfigureAwait(false); Assert.AreEqual(originalReadBytes, savedReadBytes); CollectionAssert.AreEqual(originalBytes, savedBytes); } finally { if (original.ShouldDispose) { original.Stream.Dispose(); } if (saved.ShouldDispose) { saved.Stream.Dispose(); } } } } } finally { File.Delete(headerTestFileName); File.Delete(dataTestFileName); } } }
public async Task LoadThenSaveTestAsync2MS2F() { const string headerFilePath = @"..\TestData\PrecomputedTerrain.m2h"; const string dataFilePath = @"..\TestData\PrecomputedTerrain.m2d"; MS2CryptoMode archiveCryptoMode = MS2CryptoMode.MS2F; using (MS2Archive archive = await MS2Archive.Load(headerFilePath, dataFilePath).ConfigureAwait(false)) { Assert.AreEqual(archive.CryptoMode, archiveCryptoMode); Assert.AreEqual(archive.Files.Count, 1694); Assert.AreEqual(archive.Header, new MS2SizeHeader(11056u, 8291u, 36097u)); Assert.AreEqual(archive.Data, new MS2SizeHeader(31752u, 23813u, 81312u)); const string testArchiveName = "Async2SaveTestMS2F"; const string headerTestFileName = testArchiveName + ".m2h"; const string dataTestFileName = testArchiveName + ".m2d"; try { await archive.Save(headerTestFileName, dataTestFileName, RunMode.Async2).ConfigureAwait(false); using (MS2Archive testArchive = await MS2Archive.Load(headerTestFileName, dataTestFileName).ConfigureAwait(false)) { Assert.AreEqual(archive.CryptoMode, testArchive.CryptoMode); Assert.AreEqual(archive.Files.Count, testArchive.Files.Count); Assert.AreEqual(archive.Header.Size, testArchive.Header.Size); Assert.AreEqual(archive.Data.Size, testArchive.Data.Size); Task[] tasks = new Task[testArchive.Files.Count]; for (int i = 0; i < testArchive.Files.Count; i++) { int ic = i; Assert.AreEqual(archive.Files[ic].IsZlibCompressed, testArchive.Files[ic].IsZlibCompressed); Assert.AreEqual(archive.Files[ic].CompressionType, testArchive.Files[ic].CompressionType); Assert.AreEqual(archive.Files[ic].Header?.Size, testArchive.Files[ic].Header?.Size); Assert.AreEqual(archive.Files[ic].InfoHeader.Id, testArchive.Files[ic].InfoHeader.Id); Assert.AreEqual(archive.Files[ic].InfoHeader.Name, testArchive.Files[ic].InfoHeader.Name); Assert.AreEqual(archive.Files[ic].InfoHeader.RootFolderId, testArchive.Files[ic].InfoHeader.RootFolderId); tasks[ic] = Task.Run(async() => { (Stream Stream, bool ShouldDispose, MS2SizeHeader Header)original = await archive.Files[ic].GetEncryptedStreamAsync().ConfigureAwait(false); (Stream Stream, bool ShouldDispose, MS2SizeHeader Header)saved = await testArchive.Files[ic].GetEncryptedStreamAsync().ConfigureAwait(false); try { Assert.AreEqual(original.Header.Size, saved.Header.Size); Assert.AreEqual(original.Stream.Length, saved.Stream.Length); byte[] originalBytes = new byte[original.Stream.Length]; byte[] savedBytes = new byte[saved.Stream.Length]; int originalReadBytes = await original.Stream.ReadAsync(originalBytes, 0, originalBytes.Length).ConfigureAwait(false); int savedReadBytes = await saved.Stream.ReadAsync(savedBytes, 0, savedBytes.Length).ConfigureAwait(false); Assert.AreEqual(originalReadBytes, savedReadBytes); CollectionAssert.AreEqual(originalBytes, savedBytes); } finally { if (original.ShouldDispose) { original.Stream.Dispose(); } if (saved.ShouldDispose) { saved.Stream.Dispose(); } } }); } await Task.WhenAll(tasks).ConfigureAwait(false); } } finally { File.Delete(headerTestFileName); File.Delete(dataTestFileName); } } }