a575963da9
Former-commit-id: da6be194a6b1221998fc28233f2503bd61dd9d14
60 lines
2.9 KiB
C#
60 lines
2.9 KiB
C#
using System;
|
|
using System.IO;
|
|
using System.Text;
|
|
using SharpCompress.Common.Zip;
|
|
using SharpCompress.Common.Zip.Headers;
|
|
|
|
namespace SharpCompress.Writer.Zip
|
|
{
|
|
internal class ZipCentralDirectoryEntry
|
|
{
|
|
internal string FileName { get; set; }
|
|
internal DateTime? ModificationTime { get; set; }
|
|
internal string Comment { get; set; }
|
|
internal uint Crc { get; set; }
|
|
internal uint HeaderOffset { get; set; }
|
|
internal uint Compressed { get; set; }
|
|
internal uint Decompressed { get; set; }
|
|
|
|
|
|
internal uint Write(Stream outputStream, ZipCompressionMethod compression)
|
|
{
|
|
byte[] encodedFilename = Encoding.UTF8.GetBytes(FileName);
|
|
byte[] encodedComment = Encoding.UTF8.GetBytes(Comment);
|
|
|
|
outputStream.Write(new byte[] {80, 75, 1, 2, 0x3F, 0, 0x0A, 0}, 0, 8);
|
|
HeaderFlags flags = HeaderFlags.UTF8;
|
|
if (!outputStream.CanSeek)
|
|
{
|
|
flags |= HeaderFlags.UsePostDataDescriptor;
|
|
if (compression == ZipCompressionMethod.LZMA)
|
|
{
|
|
flags |= HeaderFlags.Bit1; // eos marker
|
|
}
|
|
}
|
|
outputStream.Write(BitConverter.GetBytes((ushort) flags), 0, 2);
|
|
outputStream.Write(BitConverter.GetBytes((ushort) compression), 0, 2); // zipping method
|
|
outputStream.Write(BitConverter.GetBytes(ModificationTime.DateTimeToDosTime()), 0, 4);
|
|
// zipping date and time
|
|
outputStream.Write(BitConverter.GetBytes(Crc), 0, 4); // file CRC
|
|
outputStream.Write(BitConverter.GetBytes(Compressed), 0, 4); // compressed file size
|
|
outputStream.Write(BitConverter.GetBytes(Decompressed), 0, 4); // uncompressed file size
|
|
outputStream.Write(BitConverter.GetBytes((ushort) encodedFilename.Length), 0, 2); // Filename in zip
|
|
outputStream.Write(BitConverter.GetBytes((ushort) 0), 0, 2); // extra length
|
|
outputStream.Write(BitConverter.GetBytes((ushort) encodedComment.Length), 0, 2);
|
|
|
|
outputStream.Write(BitConverter.GetBytes((ushort) 0), 0, 2); // disk=0
|
|
outputStream.Write(BitConverter.GetBytes((ushort) 0), 0, 2); // file type: binary
|
|
outputStream.Write(BitConverter.GetBytes((ushort) 0), 0, 2); // Internal file attributes
|
|
outputStream.Write(BitConverter.GetBytes((ushort) 0x8100), 0, 2);
|
|
// External file attributes (normal/readable)
|
|
outputStream.Write(BitConverter.GetBytes(HeaderOffset), 0, 4); // Offset of header
|
|
|
|
outputStream.Write(encodedFilename, 0, encodedFilename.Length);
|
|
outputStream.Write(encodedComment, 0, encodedComment.Length);
|
|
|
|
return (uint) (8 + 2 + 2 + 4 + 4 + 4 + 4 + 2 + 2 + 2
|
|
+ 2 + 2 + 2 + 2 + 4 + encodedFilename.Length + encodedComment.Length);
|
|
}
|
|
}
|
|
} |