private static void AddFilesRecursive(ArcFile arcFile, ArcDirectoryNode root, List <ArcFileNode> files, bool mergeTrailingSlash) { if (mergeTrailingSlash) { var cleanedPath = root.Path.Trim('/'); // We don't display separate nodes for directories differing only by a trailing slash. // Try both options here in case one was removed. var rootNoSlash = arcFile.CreateNode(cleanedPath, ApplicationSettings.Instance.ArcRegion); if (rootNoSlash is ArcDirectoryNode rootDirectoryNoSlash) { AddChildrenRecursive(arcFile, files, rootDirectoryNoSlash, mergeTrailingSlash); } var rootWithSlash = arcFile.CreateNode(cleanedPath + '/', ApplicationSettings.Instance.ArcRegion); if (rootWithSlash is ArcDirectoryNode rootDirectoryWithSlash) { AddChildrenRecursive(arcFile, files, rootDirectoryWithSlash, mergeTrailingSlash); } } else { AddChildrenRecursive(arcFile, files, root, mergeTrailingSlash); } }
private static FolderNode CreateFolder(ArcFile arcFile, ArcDirectoryNode arcNode, Action <string, bool> taskStart, Action <string, double> reportProgress, Action <string> taskEnd, bool mergeTrailingSlash) { var folder = new FolderNode(arcNode.Path, arcNode); folder.FileExtracting += (s, e) => ExtractFolderAsync(arcFile, arcNode, taskStart, reportProgress, taskEnd, mergeTrailingSlash); return(folder); }
private static ExtractResult TryExtractFilesRecursive(ArcFile arcFile, ArcDirectoryNode arcNode, Action <string, double> reportProgress, bool mergeTrailingSlash) { // Loading the files first uses more memory but allows for determinate progress. var filesToExtract = new List <ArcFileNode>(); AddFilesRecursive(arcFile, arcNode, filesToExtract, mergeTrailingSlash); for (int i = 0; i < filesToExtract.Count; i++) { TryExtractFile(arcFile, filesToExtract[i]); var percentage = i / (double)filesToExtract.Count * 100; reportProgress(filesToExtract[i].Path, percentage); } // Assume the operation succeeds for now. // Individual file extractions may still fail. var result = new ExtractResult { Success = true, CompletionSummary = $"Extracted {filesToExtract.Count} files from {arcNode.Path}" }; return(result); }
private static async void ExtractFolderAsync(ArcFile arcFile, ArcDirectoryNode arcNode, Action <string, bool> taskStart, Action <string, double> reportProgress, Action <string> taskEnd, bool mergeTrailingSlash) { await RunBackgroundTask($"Extracting files from {arcNode.Path}", true, () => TryExtractFilesRecursive(arcFile, arcNode, reportProgress, mergeTrailingSlash), taskStart, taskEnd); }
private static void AddChildrenRecursive(ArcFile arcFile, List <ArcFileNode> files, ArcDirectoryNode parent, bool mergeTrailingSlash) { foreach (var child in arcFile.GetChildren(parent, ApplicationSettings.Instance.ArcRegion)) { // Assume files have no children, so only recurse for directories. switch (child) { case ArcFileNode file: files.Add(file); break; case ArcDirectoryNode directory: AddFilesRecursive(arcFile, directory, files, mergeTrailingSlash); break; default: break; } } }
private static void AddAllFilesRecursive(ArcFile arcFile, List <IArcNode> files, ArcDirectoryNode parent) { foreach (var child in arcFile.GetChildren(parent, ApplicationSettings.Instance.ArcRegion)) { // Assume files have no children, so only recurse for directories. switch (child) { case ArcFileNode file: files.Add(file); break; case ArcDirectoryNode directory: files.Add(directory); AddAllFilesRecursive(arcFile, files, directory); break; default: break; } } }