mirror of
https://github.com/adamhathcock/sharpcompress.git
synced 2026-04-24 15:09:43 +00:00
82 lines
2.5 KiB
C#
82 lines
2.5 KiB
C#
using System;
|
|
using System.IO;
|
|
using System.Linq;
|
|
using SharpCompress.Common;
|
|
using SharpCompress.Factories;
|
|
using SharpCompress.IO;
|
|
|
|
namespace SharpCompress.Readers;
|
|
|
|
public static partial class ReaderFactory
|
|
{
|
|
public static IReader OpenReader(string filePath, ReaderOptions? options = null)
|
|
{
|
|
filePath.NotNullOrEmpty(nameof(filePath));
|
|
return OpenReader(new FileInfo(filePath), options);
|
|
}
|
|
|
|
public static IReader OpenReader(FileInfo fileInfo, ReaderOptions? options = null)
|
|
{
|
|
options ??= ReaderOptions.ForOwnedFile;
|
|
return OpenReader(fileInfo.OpenRead(), options);
|
|
}
|
|
|
|
/// <summary>
|
|
/// Opens a Reader for Non-seeking usage
|
|
/// </summary>
|
|
/// <param name="stream"></param>
|
|
/// <param name="options"></param>
|
|
/// <returns></returns>
|
|
public static IReader OpenReader(Stream stream, ReaderOptions? options = null)
|
|
{
|
|
stream.NotNull(nameof(stream));
|
|
options ??= ReaderOptions.ForExternalStream;
|
|
|
|
var sharpCompressStream = SharpCompressStream.Create(
|
|
stream,
|
|
bufferSize: options.RewindableBufferSize
|
|
);
|
|
sharpCompressStream.StartRecording();
|
|
|
|
var factories = Factories.Factory.Factories.OfType<Factories.Factory>();
|
|
|
|
Factory? testedFactory = null;
|
|
|
|
if (!string.IsNullOrWhiteSpace(options.ExtensionHint))
|
|
{
|
|
testedFactory = factories.FirstOrDefault(a =>
|
|
a.GetSupportedExtensions()
|
|
.Contains(options.ExtensionHint, StringComparer.CurrentCultureIgnoreCase)
|
|
);
|
|
if (
|
|
testedFactory?.TryOpenReader(sharpCompressStream, options, out var reader) == true
|
|
&& reader != null
|
|
)
|
|
{
|
|
sharpCompressStream.Rewind(true);
|
|
return reader;
|
|
}
|
|
}
|
|
|
|
foreach (var factory in factories)
|
|
{
|
|
if (testedFactory == factory)
|
|
{
|
|
continue; // Already tested above
|
|
}
|
|
sharpCompressStream.Rewind();
|
|
if (
|
|
factory.TryOpenReader(sharpCompressStream, options, out var reader)
|
|
&& reader != null
|
|
)
|
|
{
|
|
return reader;
|
|
}
|
|
}
|
|
|
|
throw new InvalidFormatException(
|
|
"Cannot determine compressed stream type. Supported Reader Formats: Ace, Arc, Arj, Zip, GZip, BZip2, Tar, Rar, LZip, Lzw, XZ, ZStandard"
|
|
);
|
|
}
|
|
}
|