/// <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); }
/// <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)); }