internal void RecoverDeletedFiles()
        {
            DeletedFilesRecovered = true;

            var progressDialog = new GenericProgressForm
            {
                Text = "Scanning for deleted files..."
            };

            progressDialog.OnProcess += (_, __) =>
            {
                progressDialog.SetProgress("Scanning for deleted files, this may take a while...");

                var package    = (TreeViewPackageTag)mainListView.Tag;
                var foundFiles = Types.Viewers.Package.RecoverDeletedFiles(package.Package);

                Invoke((MethodInvoker)(() =>
                {
                    if (foundFiles.Count == 0)
                    {
                        var rootEmpty = mainTreeView.Nodes.Add(Types.Viewers.Package.DELETED_FILES_FOLDER, "No deleted files found", "_deleted", "_deleted");
                        rootEmpty.Tag = new TreeViewFolder(0);
                        return;
                    }

                    mainTreeView.BeginUpdate();
                    var root = mainTreeView.Nodes.Add(Types.Viewers.Package.DELETED_FILES_FOLDER, $"Deleted files ({foundFiles.Count} files found)", "_deleted", "_deleted");
                    root.Tag = new TreeViewFolder(foundFiles.Count);

                    var vpkName = Path.GetFileName(package.Package.FileName);

                    foreach (var file in foundFiles)
                    {
                        mainTreeView.AddFileNode(root, file, vpkName, skipDeletedRootFolder: true);
                    }

                    root.Expand();
                    mainTreeView.EndUpdate();
                }));
            };
            progressDialog.ShowDialog();
        }
        public static void Export(string fileName, ExportData exportData)
        {
            var resource  = exportData.Resource;
            var extension = FileExtract.GetExtension(resource);

            if (extension == null)
            {
                Console.WriteLine($"Export for \"{fileName}\" has no suitable extension");
                return;
            }

            var filter = $"{extension} file|*.{extension}";

            if (resource.ResourceType == ResourceType.Mesh || resource.ResourceType == ResourceType.Model)
            {
                if (exportData.FileType == ExportFileType.GLB)
                {
                    extension = "glb";
                    filter    = $"GLB file|*.glb|{filter}";
                }
                else
                {
                    extension = "gltf";
                    filter    = $"glTF file|*.gltf|{filter}";
                }
            }

            var dialog = new SaveFileDialog
            {
                FileName         = Path.GetFileName(Path.ChangeExtension(fileName, extension)),
                InitialDirectory = Settings.Config.SaveDirectory,
                DefaultExt       = extension,
                Filter           = filter,
            };

            var result = dialog.ShowDialog();

            if (result != DialogResult.OK)
            {
                Console.WriteLine($"Export for \"{fileName}\" cancelled");
                return;
            }

            Console.WriteLine($"Export for \"{fileName}\" started to \"{extension}\"");

            Settings.Config.SaveDirectory = Path.GetDirectoryName(dialog.FileName);
            Settings.Save();

            var extractDialog = new GenericProgressForm();

            extractDialog.OnProcess += (_, __) =>
            {
                if (resource.ResourceType == ResourceType.Mesh && dialog.FilterIndex == 1)
                {
                    var exporter = new GltfModelExporter
                    {
                        ProgressReporter = new Progress <string>(extractDialog.SetProgress),
                        FileLoader       = exportData.VrfGuiContext.FileLoader,
                    };
                    exporter.ExportToFile(fileName, dialog.FileName, new Mesh(resource));
                }
                else if (resource.ResourceType == ResourceType.Model && dialog.FilterIndex == 1)
                {
                    var exporter = new GltfModelExporter
                    {
                        ProgressReporter = new Progress <string>(extractDialog.SetProgress),
                        FileLoader       = exportData.VrfGuiContext.FileLoader,
                    };
                    exporter.ExportToFile(fileName, dialog.FileName, (Model)resource.DataBlock);
                }
                else
                {
                    var data = FileExtract.Extract(resource).ToArray();
                    using var stream = dialog.OpenFile();
                    stream.Write(data, 0, data.Length);
                }

                Console.WriteLine($"Export for \"{fileName}\" completed");
            };
            extractDialog.ShowDialog();
        }