/// <summary> /// Extracts a .deb file contained in fileEntry. /// </summary> /// <param name="fileEntry"> FileEntry to extract </param> /// <returns> Extracted files </returns> public async IAsyncEnumerable <FileEntry> ExtractAsync(FileEntry fileEntry, ExtractorOptions options, ResourceGovernor governor) { await foreach (var entry in DebArchiveFile.GetFileEntriesAsync(fileEntry, options, governor)) { await foreach (var extractedFile in Context.ExtractAsync(entry, options, governor)) { yield return(extractedFile); } } }
/// <summary> /// Extracts a .deb file contained in fileEntry. /// </summary> /// <param name="fileEntry"> FileEntry to extract </param> /// <returns> Extracted files </returns> public IEnumerable <FileEntry> Extract(FileEntry fileEntry, ExtractorOptions options, ResourceGovernor governor) { IEnumerable <FileEntry>?entries = null; try { entries = DebArchiveFile.GetFileEntries(fileEntry, options, governor); } catch (Exception e) { Logger.Debug(Extractor.DEBUG_STRING, ArchiveFileType.DEB, fileEntry.FullPath, string.Empty, e.GetType()); if (e is OverflowException) { throw; } } if (entries != null) { if (options.Parallel) { var files = new ConcurrentStack <FileEntry>(); while (entries.Any()) { var batchSize = Math.Min(options.BatchSize, entries.Count()); var selectedEntries = entries.Take(batchSize); selectedEntries.AsParallel().ForAll(entry => { files.PushRange(Context.ExtractFile(entry, options, governor).ToArray()); }); entries = entries.Skip(batchSize); while (files.TryPop(out var result)) { if (result != null) { yield return(result); } } } } else { foreach (var entry in entries) { foreach (var extractedFile in Context.ExtractFile(entry, options, governor)) { yield return(extractedFile); } } } } else { if (options.ExtractSelfOnFail) { yield return(fileEntry); } } }