public static void DumpTreeNode(GGPKFileStream stream, TreeNode n, string path, bool skipExisting=false) { if (n.IsFileNode) { var fileNode = n.Element.Left; var filePath = Path.Combine(path, fileNode.FileName); if (skipExisting && File.Exists(filePath)) return; ExportFileNode(stream, n.Element.Left, filePath); } else if (n.IsDirectoryTreeNode) { var dir = n.Element.Right; var subPath = Path.Combine(path, dir.Node.Name); Directory.CreateDirectory(subPath); foreach (var child in dir.Children) { DumpTreeNode(stream, child, subPath, skipExisting); } } }
public static void ExportFileNode(GGPKFileStream stream, FileNode fileNode, string outPath, string fileName=null) { var srcReader = new BinaryReader(stream); var original = stream.Position; var size = (int)fileNode.DataSize; var dir = Path.GetDirectoryName(outPath); var fullPath = Path.Combine(dir, fileName ?? fileNode.FileName); stream.Seek(fileNode.DataOffset, SeekOrigin.Begin); if (dir != "") Directory.CreateDirectory(dir); using (var file = File.Create(fullPath)) using (var outWriter = new BinaryWriter(file)) { if (fileNode.DataSize != 0) { outWriter.Write(srcReader.ReadBytes(size)); } } stream.Seek(original, SeekOrigin.Begin); }
public void SaveAs(GGPKFileStream stream, string path, string fileName = null) { GGPKFile.ExportFileNode(stream, this, path, fileName); }