Esempio n. 1
0
        private static async Task CreateArchiveAsync(string sourcePath, string headerFilePath, string dataFilePath)
        {
            if (!Directory.Exists(sourcePath))
            {
                throw new Exception($"Directory doesn't exist \"{sourcePath}\".");
            }

            var filePaths = GetFilesRelative(sourcePath);

            MS2File[] files = new MS2File[filePaths.Length];
            var       tasks = new Task[filePaths.Length];

            for (uint i = 0; i < filePaths.Length; i++)
            {
                uint ic = i;
                tasks[i] = Task.Run(() =>
                {
                    var(filePath, relativePath) = filePaths[ic];

                    files[ic] = MS2File.Create(ic + 1u, relativePath, CompressionType.Zlib, CryptoMode, filePath);
                });
            }

            await Task.WhenAll(tasks).ConfigureAwait(false);

            await MS2Archive.Save(CryptoMode, files, headerFilePath, dataFilePath, RunMode.Async2).ConfigureAwait(false);
        }
        private static void AddRandomFilesToArchive(MS2Archive archive)
        {
            const int    minFilesForRandom       = 10;
            const string folderForAddingName     = "FilesForAddingToArchive";
            string       folderToArchive         = Path.Combine(@"..\TestData", folderForAddingName);
            string       folderToArchiveFullPath = Path.GetFullPath(folderToArchive) + @"\";

            string[] filesToArchive = Directory.GetFiles(folderToArchive, "*.*", SearchOption.AllDirectories).Select(p => Path.GetFullPath(p)).ToArray();
            Assert.IsTrue(filesToArchive.Length > minFilesForRandom, $"you need at least {minFilesForRandom} files in the adding archive folder for this test");

            uint             count         = (uint)Random.Next(minFilesForRandom, filesToArchive.Length);
            HashSet <string> distinctFiles = new HashSet <string>();
            uint             i             = 0;

            while (i < count)
            {
                if (distinctFiles.Add(filesToArchive[Random.Next(0, filesToArchive.Length)]))
                {
                    i++;
                }
            }
            string[] files = distinctFiles.ToArray();
            Assert.AreEqual(files.Length, (int)count);
            for (i = 0; i < count; i++)
            {
                string file = files[i];

                archive.Files.Add(MS2File.Create((uint)archive.Files.Count + i, file.Remove(folderToArchiveFullPath), CompressionType.Zlib, archive.CryptoMode, file));
            }
        }
        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);
            }
        }