mirror of
https://github.com/adamhathcock/sharpcompress.git
synced 2026-02-14 05:25:41 +00:00
61 lines
2.0 KiB
C#
61 lines
2.0 KiB
C#
using System.Collections.Generic;
|
|
using System.IO;
|
|
using SharpCompress.Common.Tar.Headers;
|
|
using SharpCompress.IO;
|
|
|
|
namespace SharpCompress.Common.Tar
|
|
{
|
|
internal static class TarHeaderFactory
|
|
{
|
|
internal static IEnumerable<TarHeader> ReadHeader(StreamingMode mode, Stream stream)
|
|
{
|
|
while (true)
|
|
{
|
|
TarHeader header = null;
|
|
try
|
|
{
|
|
BinaryReader reader = new BinaryReader(stream);
|
|
header = new TarHeader();
|
|
if (!header.Read(reader))
|
|
{
|
|
yield break;
|
|
}
|
|
switch (mode)
|
|
{
|
|
case StreamingMode.Seekable:
|
|
{
|
|
header.DataStartPosition = reader.BaseStream.Position;
|
|
//skip to nearest 512
|
|
reader.BaseStream.Position += PadTo512(header.Size);
|
|
}
|
|
break;
|
|
case StreamingMode.Streaming:
|
|
{
|
|
header.PackedStream = new TarReadOnlySubStream(stream, header.Size);
|
|
}
|
|
break;
|
|
default:
|
|
{
|
|
throw new InvalidFormatException("Invalid StreamingMode");
|
|
}
|
|
}
|
|
}
|
|
catch
|
|
{
|
|
header = null;
|
|
}
|
|
yield return header;
|
|
}
|
|
}
|
|
|
|
private static long PadTo512(long size)
|
|
{
|
|
int zeros = (int) (size%512);
|
|
if (zeros == 0)
|
|
{
|
|
return size;
|
|
}
|
|
return 512 - zeros + size;
|
|
}
|
|
}
|
|
} |