Esempio n. 1
0
        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);
            }
        }
Esempio n. 2
0
        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);
        }
Esempio n. 3
0
        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);
        }
Esempio n. 4
0
 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);
 }
Esempio n. 5
0
        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;
                }
            }
        }
Esempio n. 6
0
        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;
                }
            }
        }