コード例 #1
0
        /// <summary>
        /// Extracts all Files to the specified directory.
        /// </summary>
        /// <param name="outDir"></param>
        /// <param name="pattern"></param>
        /// <param name="regex"></param>
        /// <returns></returns>
        public static (List <string>, int) ExtractAll(this Archive.Archive ar, DirectoryInfo outDir, string pattern = "", string regex = "")
        {
            var logger        = ServiceLocator.Default.ResolveType <ILoggerService>();
            var extractedList = new ConcurrentBag <string>();
            var failedList    = new ConcurrentBag <string>();

            // using var mmf = MemoryMappedFile.CreateFromFile(Filepath, FileMode.Open);

            // check search pattern then regex
            IEnumerable <ArchiveItem> finalmatches = ar.Files.Values;

            if (!string.IsNullOrEmpty(pattern))
            {
                finalmatches = ar.Files.Values.MatchesWildcard(item => item.FileName, pattern);
            }
            if (!string.IsNullOrEmpty(regex))
            {
                var searchTerm         = new System.Text.RegularExpressions.Regex($@"{regex}");
                var queryMatchingFiles =
                    from file in finalmatches
                    let matches = searchTerm.Matches(file.FileName)
                                  where matches.Count > 0
                                  select file;

                finalmatches = queryMatchingFiles;
            }

            var finalMatchesList = finalmatches.ToList();

            logger.LogString($"Found {finalMatchesList.Count} bundle entries to extract.", Logtype.Important);

            Thread.Sleep(1000);
            int progress = 0;

            logger.LogProgress(0);
            Parallel.ForEach(finalMatchesList, info =>
            {
                var extracted = ar.ExtractSingleInner(info.NameHash64, outDir);

                if (extracted != 0)
                {
                    extractedList.Add(info.FileName);
                }
                else
                {
                    failedList.Add(info.FileName);
                }

                Interlocked.Increment(ref progress);
                logger.LogProgress(progress / (float)finalMatchesList.Count);
            });

            return(extractedList.ToList(), finalMatchesList.Count);
        }
コード例 #2
0
        /// <summary>
        /// Extracts a single file + buffers.
        /// </summary>
        /// <param name="ar"></param>
        /// <param name="hash"></param>
        /// <param name="outDir"></param>
        /// <returns></returns>
        public static int ExtractSingle(this Archive.Archive ar, ulong hash, DirectoryInfo outDir)
        {
            // using var mmf = MemoryMappedFile.CreateFromFile(Filepath, FileMode.Open);

            return(ar.ExtractSingleInner(hash, outDir));
        }