public void TestEntryFile() { var binaryFile = this.Fixture.RuneTek5Cache.GetFile <BinaryFile>(Index.ItemDefinitions, 155); var entryFile = new EntryFile(); entryFile.FromBinaryFile(binaryFile); var binaryFile1 = entryFile.GetEntry <BinaryFile>(0); Assert.Equal(242, binaryFile1.Data.Length); var itemDefinitionFile = entryFile.GetEntry <ItemDefinitionFile>(0); Assert.Equal(2609, itemDefinitionFile.UnknownShort4); var itemDefinitionFiles = entryFile.GetEntries <ItemDefinitionFile>(); Assert.Equal(256, entryFile.EntryCount); Assert.Equal(2609, itemDefinitionFiles.First(file => file.Info.EntryId == 0).UnknownShort4); Assert.True(entryFile.Encode().SequenceEqual(binaryFile.Data)); }
protected override void PutBinaryFile(BinaryFile file) { // Throw an exception if the output directory is not yet set or does not exist if (string.IsNullOrWhiteSpace(this.BaseDirectory)) { throw new InvalidOperationException("Base directory must be set before writing files."); } var indexDirectory = this.GetIndexDirectory(file.Info.Index); // Create index directory for when it does not exist yet Directory.CreateDirectory(indexDirectory); // Clean existing files/entries foreach (var existingFilePath in this.GetExistingFilePaths(file.Info.Index, file.Info.FileId.Value)) { File.Delete(existingFilePath); } var entryDirectory = this.GetEntryDirectory(file.Info.Index, file.Info.FileId.Value); if (Directory.Exists(entryDirectory)) { Directory.Delete(entryDirectory, true); } if (!file.Info.UsesEntries) { // Extract file if (file.Data.Length > 0) { var extension = ExtensionGuesser.GuessExtension(file.Data); extension = extension != null ? $".{extension}" : ""; var filePath = $"{indexDirectory}{file.Info.FileId}{extension}"; File.WriteAllBytes(filePath, file.Data); _logger.Information($"Wrote {(int)file.Info.Index}/{file.Info.FileId}."); } else { _logger.Information($"Did not write {(int)file.Info.Index}/{file.Info.FileId} because it is empty."); } } else { // Extract entries var entryFile = new EntryFile(); entryFile.FromBinaryFile(file); if (!entryFile.Empty) { Directory.CreateDirectory(entryDirectory); var entryBinaryFiles = entryFile.GetEntries <BinaryFile>().ToList(); foreach (var entryBinaryFile in entryBinaryFiles) { var extension = ExtensionGuesser.GuessExtension(entryBinaryFile.Data); extension = extension != null ? $".{extension}" : ""; var entryPath = $"{entryDirectory}{entryBinaryFile.Info.EntryId}{extension}"; File.WriteAllBytes(entryPath, entryBinaryFile.Data); } _logger.Information($"Wrote {(int)file.Info.Index}/{file.Info.FileId} ({entryBinaryFiles.Count} entries)."); } else { _logger.Information($"Did not write {(int)file.Info.Index}/{file.Info.FileId} because it contains no entries."); } } }