/// Extracts an BZip2 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) { BZip2Stream?bzip2Stream = null; try { bzip2Stream = new BZip2Stream(fileEntry.Content, SharpCompress.Compressors.CompressionMode.Decompress, false); governor.CheckResourceGovernor(bzip2Stream.Length); } catch (Exception e) { Logger.Debug(Extractor.DEBUG_STRING, ArchiveFileType.BZIP2, fileEntry.FullPath, string.Empty, e.GetType()); } if (bzip2Stream != null) { var newFilename = Path.GetFileNameWithoutExtension(fileEntry.Name); var entryStream = bzip2Stream.Length > options.MemoryStreamCutoff ? new FileStream(Path.GetTempFileName(), FileMode.Create, FileAccess.ReadWrite, FileShare.ReadWrite, 4096, FileOptions.DeleteOnClose) : (Stream) new MemoryStream((int)bzip2Stream.Length); var newFileEntry = new FileEntry(newFilename, bzip2Stream, fileEntry); if (Extractor.IsQuine(newFileEntry)) { Logger.Info(Extractor.IS_QUINE_STRING, fileEntry.Name, fileEntry.FullPath); bzip2Stream.Dispose(); throw new OverflowException(); } foreach (var extractedFile in Context.Extract(newFileEntry, options, governor)) { yield return(extractedFile); } bzip2Stream.Dispose(); } else { if (options.ExtractSelfOnFail) { yield return(fileEntry); } } }
/// <summary> /// Extracts an BZip2 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) { BZip2Stream?bzip2Stream = null; try { bzip2Stream = new BZip2Stream(fileEntry.Content, SharpCompress.Compressors.CompressionMode.Decompress, false); governor.CheckResourceGovernor(bzip2Stream.Length); } catch (Exception e) { Logger.Debug(Extractor.DEBUG_STRING, ArchiveFileType.BZIP2, fileEntry.FullPath, string.Empty, e.GetType()); } if (bzip2Stream != null) { var newFilename = Path.GetFileNameWithoutExtension(fileEntry.Name); var newFileEntry = await FileEntry.FromStreamAsync(newFilename, bzip2Stream, fileEntry); if (Extractor.IsQuine(newFileEntry)) { Logger.Info(Extractor.IS_QUINE_STRING, fileEntry.Name, fileEntry.FullPath); bzip2Stream.Dispose(); throw new OverflowException(); } await foreach (var extractedFile in Context.ExtractAsync(newFileEntry, options, governor)) { yield return(extractedFile); } bzip2Stream.Dispose(); } else { if (options.ExtractSelfOnFail) { yield return(fileEntry); } } }
public static string DecompressString(byte[] byteArray) { MemoryStream ms = new MemoryStream(byteArray); BZip2Stream gzip = new BZip2Stream(ms, SharpCompress.Compressor.CompressionMode.Decompress, true); byte[] buffer = StreamToByteArray(gzip); StringBuilder sb = new StringBuilder(); for (int i = 0; i < buffer.Length; i++) { sb.Append((char)buffer[i]); } gzip.Flush(); gzip.Dispose(); ms.Dispose(); return(sb.ToString()); }