2019-12-04 15:42:30 -08:00
|
|
|
|
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;
|
|
|
|
|
|
|
2020-04-03 13:19:21 -07:00
|
|
|
|
for (; ; )
|
2019-12-04 15:42:30 -08:00
|
|
|
|
{
|
2020-04-03 13:19:21 -07:00
|
|
|
|
HeaderProperty hp = (HeaderProperty)br.ReadByte();
|
2019-12-04 15:42:30 -08:00
|
|
|
|
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:
|
2020-04-03 13:19:21 -07:00
|
|
|
|
EmptyStreamFlags = Util.ReadBoolFlags(br, (ulong)Names.Length);
|
2019-12-04 15:42:30 -08:00
|
|
|
|
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:
|
2020-04-03 13:19:21 -07:00
|
|
|
|
br.ReadBytes((int)bytessize);
|
2019-12-04 15:42:30 -08:00
|
|
|
|
continue;
|
|
|
|
|
|
|
|
|
|
|
|
case HeaderProperty.kDummy:
|
2020-04-03 13:19:21 -07:00
|
|
|
|
br.ReadBytes((int)bytessize);
|
2019-12-04 15:42:30 -08:00
|
|
|
|
continue;
|
|
|
|
|
|
|
|
|
|
|
|
default:
|
|
|
|
|
|
throw new Exception(hp.ToString());
|
|
|
|
|
|
}
|
|
|
|
|
|
}
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
public void Write(BinaryWriter bw)
|
|
|
|
|
|
{
|
2020-04-03 13:19:21 -07:00
|
|
|
|
bw.Write((byte)HeaderProperty.kFilesInfo);
|
|
|
|
|
|
bw.WriteEncodedUInt64((ulong)Names.Length);
|
2019-12-04 15:42:30 -08:00
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
byte[] namebyte;
|
|
|
|
|
|
using (MemoryStream nameMem = new MemoryStream())
|
|
|
|
|
|
{
|
2020-04-03 13:19:21 -07:00
|
|
|
|
using (BinaryWriter nameBw = new BinaryWriter(nameMem, Encoding.UTF8, true))
|
2019-12-04 15:42:30 -08:00
|
|
|
|
{
|
2020-04-03 13:19:21 -07:00
|
|
|
|
nameBw.Write((byte)0); //not external
|
2019-12-04 15:42:30 -08:00
|
|
|
|
foreach (string name in Names)
|
|
|
|
|
|
{
|
|
|
|
|
|
nameBw.WriteName(name);
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
namebyte = new byte[nameMem.Length];
|
|
|
|
|
|
nameMem.Position = 0;
|
|
|
|
|
|
nameMem.Read(namebyte, 0, namebyte.Length);
|
|
|
|
|
|
}
|
|
|
|
|
|
}
|
|
|
|
|
|
|
2020-04-03 13:19:21 -07:00
|
|
|
|
bw.Write((byte)HeaderProperty.kName);
|
|
|
|
|
|
bw.WriteEncodedUInt64((ulong)namebyte.Length);
|
2019-12-04 15:42:30 -08:00
|
|
|
|
bw.Write(namebyte);
|
|
|
|
|
|
|
|
|
|
|
|
if (EmptyStreamFlags != null)
|
|
|
|
|
|
{
|
2020-04-03 13:19:21 -07:00
|
|
|
|
bw.Write((byte)HeaderProperty.kEmptyStream);
|
2019-12-04 15:42:30 -08:00
|
|
|
|
Util.WriteBoolFlags(bw, EmptyStreamFlags);
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
if (EmptyFileFlags != null)
|
|
|
|
|
|
{
|
2020-04-03 13:19:21 -07:00
|
|
|
|
bw.Write((byte)HeaderProperty.kEmptyFile);
|
2019-12-04 15:42:30 -08:00
|
|
|
|
Util.WriteBoolFlags(bw, EmptyFileFlags);
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
if (Attributes != null)
|
|
|
|
|
|
{
|
2020-04-03 13:19:21 -07:00
|
|
|
|
bw.Write((byte)HeaderProperty.kWinAttributes);
|
2019-12-04 15:42:30 -08:00
|
|
|
|
Util.WriteUint32Def(bw, Attributes);
|
|
|
|
|
|
}
|
|
|
|
|
|
|
2020-04-03 13:19:21 -07:00
|
|
|
|
bw.Write((byte)HeaderProperty.kEnd);
|
2019-12-04 15:42:30 -08:00
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
public void Report(ref StringBuilder sb)
|
|
|
|
|
|
{
|
|
|
|
|
|
sb.AppendLine(" FileInfo");
|
|
|
|
|
|
sb.AppendLine(" ------");
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
}
|