Files
sharpcompress/src/SharpCompress/Readers/ReaderFactory.cs

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