/// <summary> /// Exports entire DirectoryTreeNode to disk, preserving directory structure /// </summary> /// <param name="selectedDirectoryNode">Node to export to disk</param> private void ExportAllItemsInDirectory(DirectoryTreeNode selectedDirectoryNode) { List <FileRecord> recordsToExport = new List <FileRecord>(); Action <FileRecord> fileAction = recordsToExport.Add; DirectoryTreeNode.TraverseTreePreorder(selectedDirectoryNode, null, fileAction); try { SaveFileDialog saveFileDialog = new SaveFileDialog { FileName = Settings.Strings["ExportAllItemsInDirectory_Default_FileName"] }; if (saveFileDialog.ShowDialog() != true) { return; } string exportDirectory = Path.GetDirectoryName(saveFileDialog.FileName) + Path.DirectorySeparatorChar; foreach (var item in recordsToExport) { item.ExtractFileWithDirectoryStructure(ggpkPath, exportDirectory); } MessageBox.Show(string.Format(Settings.Strings["ExportAllItemsInDirectory_Successful"], recordsToExport.Count), Settings.Strings["ExportAllItemsInDirectory_Successful_Caption"], MessageBoxButton.OK, MessageBoxImage.Information); } catch (Exception ex) { MessageBox.Show(string.Format(Settings.Strings["ExportAllItemsInDirectory_Failed"], ex.Message), Settings.Strings["Error_Caption"], MessageBoxButton.OK, MessageBoxImage.Error); } }