mirror of
https://github.com/claunia/SabreTools.git
synced 2025-12-16 19:14:27 +00:00
140 lines
4.3 KiB
C#
140 lines
4.3 KiB
C#
|
|
using System;
|
|||
|
|
using System.IO;
|
|||
|
|
using System.Text;
|
|||
|
|
|
|||
|
|
namespace Compress.SevenZip.Structure
|
|||
|
|
{
|
|||
|
|
public class FileInfo
|
|||
|
|
{
|
|||
|
|
public string[] Names;
|
|||
|
|
public bool[] EmptyStreamFlags;
|
|||
|
|
public bool[] EmptyFileFlags;
|
|||
|
|
public uint[] Attributes;
|
|||
|
|
|
|||
|
|
public void Read(BinaryReader br)
|
|||
|
|
{
|
|||
|
|
ulong size = br.ReadEncodedUInt64();
|
|||
|
|
Names = new string[size];
|
|||
|
|
|
|||
|
|
ulong numEmptyFiles = 0;
|
|||
|
|
|
|||
|
|
for (;;)
|
|||
|
|
{
|
|||
|
|
HeaderProperty hp = (HeaderProperty) br.ReadByte();
|
|||
|
|
if (hp == HeaderProperty.kEnd)
|
|||
|
|
{
|
|||
|
|
return;
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
ulong bytessize = br.ReadEncodedUInt64();
|
|||
|
|
switch (hp)
|
|||
|
|
{
|
|||
|
|
case HeaderProperty.kName:
|
|||
|
|
if (br.ReadByte() != 0)
|
|||
|
|
{
|
|||
|
|
throw new Exception("Cannot be external");
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
for (ulong i = 0; i < size; i++)
|
|||
|
|
{
|
|||
|
|
Names[i] = br.ReadName();
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
continue;
|
|||
|
|
|
|||
|
|
case HeaderProperty.kEmptyStream:
|
|||
|
|
EmptyStreamFlags = Util.ReadBoolFlags(br, (ulong) Names.Length);
|
|||
|
|
for (ulong i = 0; i < size; i++)
|
|||
|
|
{
|
|||
|
|
if (EmptyStreamFlags[i])
|
|||
|
|
{
|
|||
|
|
numEmptyFiles++;
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
continue;
|
|||
|
|
|
|||
|
|
case HeaderProperty.kEmptyFile:
|
|||
|
|
EmptyFileFlags = Util.ReadBoolFlags(br, numEmptyFiles);
|
|||
|
|
continue;
|
|||
|
|
|
|||
|
|
case HeaderProperty.kWinAttributes:
|
|||
|
|
Attributes = Util.ReadUInt32Def(br, size);
|
|||
|
|
continue;
|
|||
|
|
|
|||
|
|
// don't know what this is.
|
|||
|
|
case HeaderProperty.kAnti:
|
|||
|
|
br.ReadBytes((int)bytessize);
|
|||
|
|
continue;
|
|||
|
|
|
|||
|
|
case HeaderProperty.kCreationTime:
|
|||
|
|
case HeaderProperty.kLastAccessTime:
|
|||
|
|
case HeaderProperty.kLastWriteTime:
|
|||
|
|
br.ReadBytes((int) bytessize);
|
|||
|
|
continue;
|
|||
|
|
|
|||
|
|
case HeaderProperty.kDummy:
|
|||
|
|
br.ReadBytes((int) bytessize);
|
|||
|
|
continue;
|
|||
|
|
|
|||
|
|
default:
|
|||
|
|
throw new Exception(hp.ToString());
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
public void Write(BinaryWriter bw)
|
|||
|
|
{
|
|||
|
|
bw.Write((byte) HeaderProperty.kFilesInfo);
|
|||
|
|
bw.WriteEncodedUInt64((ulong) Names.Length);
|
|||
|
|
|
|||
|
|
|
|||
|
|
byte[] namebyte;
|
|||
|
|
using (MemoryStream nameMem = new MemoryStream())
|
|||
|
|
{
|
|||
|
|
using (BinaryWriter nameBw = new BinaryWriter(nameMem,Encoding.UTF8,true))
|
|||
|
|
{
|
|||
|
|
nameBw.Write((byte) 0); //not external
|
|||
|
|
foreach (string name in Names)
|
|||
|
|
{
|
|||
|
|
nameBw.WriteName(name);
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
namebyte = new byte[nameMem.Length];
|
|||
|
|
nameMem.Position = 0;
|
|||
|
|
nameMem.Read(namebyte, 0, namebyte.Length);
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
bw.Write((byte) HeaderProperty.kName);
|
|||
|
|
bw.WriteEncodedUInt64((ulong) namebyte.Length);
|
|||
|
|
bw.Write(namebyte);
|
|||
|
|
|
|||
|
|
if (EmptyStreamFlags != null)
|
|||
|
|
{
|
|||
|
|
bw.Write((byte) HeaderProperty.kEmptyStream);
|
|||
|
|
Util.WriteBoolFlags(bw, EmptyStreamFlags);
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
if (EmptyFileFlags != null)
|
|||
|
|
{
|
|||
|
|
bw.Write((byte) HeaderProperty.kEmptyFile);
|
|||
|
|
Util.WriteBoolFlags(bw, EmptyFileFlags);
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
if (Attributes != null)
|
|||
|
|
{
|
|||
|
|
bw.Write((byte) HeaderProperty.kWinAttributes);
|
|||
|
|
Util.WriteUint32Def(bw, Attributes);
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
bw.Write((byte) HeaderProperty.kEnd);
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
public void Report(ref StringBuilder sb)
|
|||
|
|
{
|
|||
|
|
sb.AppendLine(" FileInfo");
|
|||
|
|
sb.AppendLine(" ------");
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
}
|
|||
|
|
}
|