Example #1
0
 internal GZipFilePart(Stream stream, ArchiveEncoding archiveEncoding)
     : base(archiveEncoding)
 {
     ReadAndValidateGzipHeader(stream);
     EntryStartPosition = stream.Position;
     _stream            = stream;
 }
Example #2
0
        private string ReadZeroTerminatedString(Stream stream)
        {
            byte[] buf1 = new byte[1];
            var    list = new List <byte>();
            bool   done = false;

            do
            {
                // workitem 7740
                int n = stream.Read(buf1, 0, 1);
                if (n != 1)
                {
                    throw new ZlibException("Unexpected EOF reading GZIP header.");
                }
                if (buf1[0] == 0)
                {
                    done = true;
                }
                else
                {
                    list.Add(buf1[0]);
                }
            }while (!done);
            byte[] buffer = list.ToArray();
            return(ArchiveEncoding.Decode(buffer));
        }
 public void Tar_Japanese_Name(int length)
 {
     using (var mstm = new MemoryStream())
     {
         var enc = new ArchiveEncoding()
         {
             Default = Encoding.UTF8
         };
         var twopt = new TarWriterOptions(CompressionType.None, true);
         twopt.ArchiveEncoding = enc;
         var fname = new string((char)0x3042, length);
         using (var tw = new TarWriter(mstm, twopt))
             using (var input = new MemoryStream(new byte[32]))
             {
                 tw.Write(fname, input, null);
             }
         using (var inputMemory = new MemoryStream(mstm.ToArray()))
         {
             var tropt = new ReaderOptions()
             {
                 ArchiveEncoding = enc
             };
             using (var tr = TarReader.Open(inputMemory, tropt))
             {
                 while (tr.MoveToNextEntry())
                 {
                     Assert.Equal(fname, tr.Entry.Key);
                 }
             }
         }
     }
 }
 public ZipCentralDirectoryEntry(ZipCompressionMethod compression, string fileName, ulong headerOffset, ArchiveEncoding archiveEncoding)
 {
     this.compression     = compression;
     this.fileName        = fileName;
     HeaderOffset         = headerOffset;
     this.archiveEncoding = archiveEncoding;
 }
Example #5
0
 public ChardetReaderOptions()
 {
     ArchiveEncoding = new ArchiveEncoding
     {
         CustomDecoder = Chardet
     };
 }
        internal override void Read(BinaryReader reader)
        {
            Version           = reader.ReadUInt16();
            Flags             = (HeaderFlags)reader.ReadUInt16();
            CompressionMethod = (ZipCompressionMethod)reader.ReadUInt16();
            LastModifiedTime  = reader.ReadUInt16();
            LastModifiedDate  = reader.ReadUInt16();
            Crc              = reader.ReadUInt32();
            CompressedSize   = reader.ReadUInt32();
            UncompressedSize = reader.ReadUInt32();
            ushort nameLength  = reader.ReadUInt16();
            ushort extraLength = reader.ReadUInt16();

            byte[] name  = reader.ReadBytes(nameLength);
            byte[] extra = reader.ReadBytes(extraLength);

            // According to .ZIP File Format Specification
            //
            // For example: https://pkware.cachefly.net/webdocs/casestudies/APPNOTE.TXT
            //
            // Bit 11: Language encoding flag (EFS).  If this bit is set,
            //         the filename and comment fields for this file
            //         MUST be encoded using UTF-8. (see APPENDIX D)

            if (Flags.HasFlag(HeaderFlags.Efs))
            {
                Name = ArchiveEncoding.DecodeUTF8(name);
            }
            else
            {
                Name = ArchiveEncoding.Decode(name);
            }

            LoadExtra(extra);

            var unicodePathExtra = Extra.FirstOrDefault(u => u.Type == ExtraDataType.UnicodePathExtraField);

            if (unicodePathExtra != null)
            {
                Name = ((ExtraUnicodePathExtraField)unicodePathExtra).UnicodeName;
            }

            var zip64ExtraData = Extra.OfType <Zip64ExtendedInformationExtraField>().FirstOrDefault();

            if (zip64ExtraData != null)
            {
                zip64ExtraData.Process(UncompressedSize, CompressedSize, 0, 0);

                if (CompressedSize == uint.MaxValue)
                {
                    CompressedSize = zip64ExtraData.CompressedSize;
                }
                if (UncompressedSize == uint.MaxValue)
                {
                    UncompressedSize = zip64ExtraData.UncompressedSize;
                }
            }
        }
Example #7
0
        internal override void Read(BinaryReader reader)
        {
            Version = reader.ReadUInt16();
            VersionNeededToExtract = reader.ReadUInt16();
            Flags             = (HeaderFlags)reader.ReadUInt16();
            CompressionMethod = (ZipCompressionMethod)reader.ReadUInt16();
            LastModifiedTime  = reader.ReadUInt16();
            LastModifiedDate  = reader.ReadUInt16();
            Crc              = reader.ReadUInt32();
            CompressedSize   = reader.ReadUInt32();
            UncompressedSize = reader.ReadUInt32();
            ushort nameLength    = reader.ReadUInt16();
            ushort extraLength   = reader.ReadUInt16();
            ushort commentLength = reader.ReadUInt16();

            DiskNumberStart             = reader.ReadUInt16();
            InternalFileAttributes      = reader.ReadUInt16();
            ExternalFileAttributes      = reader.ReadUInt32();
            RelativeOffsetOfEntryHeader = reader.ReadUInt32();

            byte[] name = reader.ReadBytes(nameLength);
            Name = ArchiveEncoding.Decode(name);
            byte[] extra   = reader.ReadBytes(extraLength);
            byte[] comment = reader.ReadBytes(commentLength);
            Comment = ArchiveEncoding.Decode(comment);
            LoadExtra(extra);

            var unicodePathExtra = Extra.FirstOrDefault(u => u.Type == ExtraDataType.UnicodePathExtraField);

            if (unicodePathExtra != null)
            {
                Name = ((ExtraUnicodePathExtraField)unicodePathExtra).UnicodeName;
            }

            var zip64ExtraData = Extra.OfType <Zip64ExtendedInformationExtraField>().FirstOrDefault();

            if (zip64ExtraData != null)
            {
                if (CompressedSize == uint.MaxValue)
                {
                    CompressedSize = zip64ExtraData.CompressedSize;
                }
                if (UncompressedSize == uint.MaxValue)
                {
                    UncompressedSize = zip64ExtraData.UncompressedSize;
                }
                if (RelativeOffsetOfEntryHeader == uint.MaxValue)
                {
                    RelativeOffsetOfEntryHeader = zip64ExtraData.RelativeOffsetOfEntryHeader;
                }
            }
        }
Example #8
0
 internal GZipFilePart(Stream stream, ArchiveEncoding archiveEncoding)
     : base(archiveEncoding)
 {
     _stream = stream;
     ReadAndValidateGzipHeader();
     if (stream.CanSeek)
     {
         long position = stream.Position;
         stream.Position = stream.Length - 8;
         ReadTrailer();
         stream.Position = position;
     }
     EntryStartPosition = stream.Position;
 }
Example #9
0
        public static Encoding GetEncoding(this ArchiveEncoding encodingEnum)
        {
            switch (encodingEnum)
            {
            case ArchiveEncoding.UTF8:
                return(Encoding.UTF8);

            case ArchiveEncoding.UTF16:
                return(Encoding.Unicode);

            default:
                throw new ArgumentException(nameof(encodingEnum));
            }
        }
Example #10
0
        internal override void Read(BinaryReader reader)
        {
            Version           = reader.ReadUInt16();
            Flags             = (HeaderFlags)reader.ReadUInt16();
            CompressionMethod = (ZipCompressionMethod)reader.ReadUInt16();
            LastModifiedTime  = reader.ReadUInt16();
            LastModifiedDate  = reader.ReadUInt16();
            Crc              = reader.ReadUInt32();
            CompressedSize   = reader.ReadUInt32();
            UncompressedSize = reader.ReadUInt32();
            ushort nameLength  = reader.ReadUInt16();
            ushort extraLength = reader.ReadUInt16();

            byte[] name  = reader.ReadBytes(nameLength);
            byte[] extra = reader.ReadBytes(extraLength);

            if (Flags.HasFlag(HeaderFlags.Efs))
            {
                Name = ArchiveEncoding.Decode(name);
            }
            else
            {
                // Use IBM Code Page 437 (IBM PC character encoding set)
                Name = ArchiveEncoding.Decode437(name);
            }

            LoadExtra(extra);

            var unicodePathExtra = Extra.FirstOrDefault(u => u.Type == ExtraDataType.UnicodePathExtraField);

            if (unicodePathExtra != null)
            {
                Name = ((ExtraUnicodePathExtraField)unicodePathExtra).UnicodeName;
            }

            var zip64ExtraData = Extra.OfType <Zip64ExtendedInformationExtraField>().FirstOrDefault();

            if (zip64ExtraData != null)
            {
                if (CompressedSize == uint.MaxValue)
                {
                    CompressedSize = zip64ExtraData.CompressedSize;
                }
                if (UncompressedSize == uint.MaxValue)
                {
                    UncompressedSize = zip64ExtraData.UncompressedSize;
                }
            }
        }
        /// <summary>
        /// Compress entrie[file or directorie] to dest zip file.
        /// </summary>
        /// <param name="entries">Target entrie[files or directories].</param>
        /// <param name="destFile">The dest file.</param>
        /// <param name="encoding">Encoding for zip file.</param>
        /// <param name="directoryPathInArchive">Directory path in archive of zip file [Not supported this version].</param>
        /// <param name="clearBefor">Clear origin file(if exists) befor compress.</param>
        /// <param name="progressCallback">Progress callback.</param>
        /// <param name="finishedCallback">Finished callback.</param>
        public virtual void Compress(IEnumerable <string> entries, string destFile,
                                     Encoding encoding, string directoryPathInArchive = null, bool clearBefor = true,
                                     Action <float> progressCallback = null, Action <bool, string, Exception> finishedCallback = null)
        {
            try
            {
                if (clearBefor && File.Exists(destFile))
                {
                    File.Delete(destFile);
                }

                using (var archive = ZipArchive.Create())
                {
                    var index = 0f;
                    var count = new List <string>(entries).Count;
                    foreach (var entry in entries)
                    {
                        archive.AddAllFromDirectory(entry);
                        index++;

                        var progress = (index / count) * 0.75f;
                        progressCallback?.Invoke(progress);
                    }

                    using (var stream = File.OpenWrite(destFile))
                    {
                        var archiveEncoding = new ArchiveEncoding {
                            Default = encoding
                        };
                        var options = new WriterOptions(CompressionType.Deflate)
                        {
                            ArchiveEncoding = archiveEncoding
                        };
                        archive.SaveTo(stream, options);
                    }
                }

                progressCallback?.Invoke(1.0f);
                finishedCallback?.Invoke(true, destFile, null);
            }
            catch (Exception ex)
            {
                finishedCallback?.Invoke(false, null, ex);
            }
        }
Example #12
0
        internal static RarHeader Create(RarCrcBinaryReader reader, ArchiveEncoding archiveEncoding)
        {
            try
            {
                RarHeader header = new RarHeader();

                header.ArchiveEncoding = archiveEncoding;
                reader.Mark();
                header.ReadStartFromReader(reader);
                header.ReadBytes += reader.CurrentReadByteCount;

                return header;
            }
            catch (EndOfStreamException)
            {
                return null;
            }
        }
Example #13
0
        /// <summary>
        /// 压缩文件夹
        /// </summary>
        /// <param name="sourceFolderPath">待压缩的文件夹路径</param>
        /// <param name="targetFilePath">压缩后的文件路径,格式为.zip</param>
        public static void ZipFolders(string sourceFolderPath, string targetFilePath)
        {
            ArchiveEncoding ArchiveEncoding = new ArchiveEncoding();

            ArchiveEncoding.Default = Encoding.GetEncoding("utf-8");
            WriterOptions zipOptions = new WriterOptions(CompressionType.Deflate);

            zipOptions.ArchiveEncoding = ArchiveEncoding;

            using (var archive = ZipArchive.Create())
            {
                archive.AddAllFromDirectory(sourceFolderPath);
                using (var zipStream = File.OpenWrite(targetFilePath))
                {
                    archive.SaveTo(zipStream, zipOptions);
                }
            }
        }
Example #14
0
        public void Tar_Read_One_At_A_Time()
        {
            var archiveEncoding = new ArchiveEncoding {
                Default = Encoding.UTF8,
            };
            var tarWriterOptions = new TarWriterOptions(CompressionType.None, true)
            {
                ArchiveEncoding = archiveEncoding,
            };
            var testBytes = Encoding.UTF8.GetBytes("This is a test.");

            using (var memoryStream = new MemoryStream())
            {
                using (var tarWriter = new TarWriter(memoryStream, tarWriterOptions))
                    using (var testFileStream = new MemoryStream(testBytes))
                    {
                        tarWriter.Write("test1.txt", testFileStream);
                        testFileStream.Position = 0;
                        tarWriter.Write("test2.txt", testFileStream);
                    }

                memoryStream.Position = 0;

                var numberOfEntries = 0;

                using (var archiveFactory = TarArchive.Open(memoryStream))
                {
                    foreach (var entry in archiveFactory.Entries)
                    {
                        ++numberOfEntries;

                        using (var tarEntryStream = entry.OpenEntryStream())
                            using (var testFileStream = new MemoryStream())
                            {
                                tarEntryStream.CopyTo(testFileStream);
                                Assert.Equal(testBytes.Length, testFileStream.Length);
                            }
                    }
                }

                Assert.Equal(2, numberOfEntries);
            }
        }
Example #15
0
        /// <summary>
        /// 压缩文件
        /// </summary>
        /// <param name="sourceFilePaths">待压缩的文件路径,可包含单个或多个文件</param>
        /// <param name="targetFilePath">压缩后的文件路径,格式为.zip</param>
        public static void ZipFiles(IList <string> sourceFilePaths, string targetFilePath)
        {
            ArchiveEncoding ArchiveEncoding = new ArchiveEncoding();

            ArchiveEncoding.Default = Encoding.GetEncoding("utf-8");
            WriterOptions zipOptions = new WriterOptions(CompressionType.Deflate);

            zipOptions.ArchiveEncoding = ArchiveEncoding;

            using (var archive = ZipArchive.Create())
            {
                foreach (var sourceFilePath in sourceFilePaths)
                {
                    var sourceFile = new FileInfo(sourceFilePath);
                    archive.AddEntry(sourceFile.Name, sourceFile.OpenRead());
                }

                using (var zipStream = File.OpenWrite(targetFilePath))
                {
                    archive.SaveTo(zipStream, zipOptions);
                }
            }
        }
Example #16
0
        private RarHeader(RarCrcBinaryReader reader, bool isRar5, ArchiveEncoding archiveEncoding)
        {
            _headerType     = HeaderType.Null;
            _isRar5         = isRar5;
            ArchiveEncoding = archiveEncoding;
            if (IsRar5)
            {
                HeaderCrc = reader.ReadUInt32();
                reader.ResetCrc();
                HeaderSize = (int)reader.ReadRarVIntUInt32(3);
                reader.Mark();
                HeaderCode  = reader.ReadRarVIntByte();
                HeaderFlags = reader.ReadRarVIntUInt16(2);

                if (HasHeaderFlag(HeaderFlagsV5.HAS_EXTRA))
                {
                    ExtraSize = reader.ReadRarVIntUInt32();
                }
                if (HasHeaderFlag(HeaderFlagsV5.HAS_DATA))
                {
                    AdditionalDataSize = (long)reader.ReadRarVInt();
                }
            }
            else
            {
                reader.Mark();
                HeaderCrc = reader.ReadUInt16();
                reader.ResetCrc();
                HeaderCode  = reader.ReadByte();
                HeaderFlags = reader.ReadUInt16();
                HeaderSize  = reader.ReadInt16();
                if (HasHeaderFlag(HeaderFlagsV4.HAS_DATA))
                {
                    AdditionalDataSize = reader.ReadUInt32();
                }
            }
        }
Example #17
0
        private IEnumerable <ArchiveEncoding> GetEncodingByMode(ReadFileEncodingType encodingMode)
        {
            var encList = new List <ArchiveEncoding>();

            if (encodingMode == ReadFileEncodingType.S_JIS)
            {
                var tEnc = new ArchiveEncoding()
                {
                    Default = Encoding.GetEncoding("shift-jis")
                };
                encList.Add(tEnc);
            }
            else if (encodingMode == ReadFileEncodingType.UTF_8)
            {
                var tEnc = new ArchiveEncoding()
                {
                    Default = new UTF8Encoding(false)
                };
                encList.Add(tEnc);
            }
            else if (encodingMode == ReadFileEncodingType.UTF_8AndS_JIS)
            {
                var tEnc = new ArchiveEncoding()
                {
                    Default = new UTF8Encoding(false)
                };
                encList.Add(tEnc);
                tEnc = new ArchiveEncoding()
                {
                    Default = Encoding.GetEncoding("shift-jis")
                };
                encList.Add(tEnc);
            }

            return(encList);
        }
 internal SeekableZipHeaderFactory(string password, ArchiveEncoding archiveEncoding)
     : base(StreamingMode.Seekable, password, archiveEncoding)
 {
 }
 private PkwareTraditionalEncryptionData(string password, ArchiveEncoding archiveEncoding)
 {
     _archiveEncoding = archiveEncoding;
     Initialize(password);
 }
Example #20
0
 protected ZipHeaderFactory(StreamingMode mode, string password, ArchiveEncoding archiveEncoding)
 {
     this._mode            = mode;
     this._password        = password;
     this._archiveEncoding = archiveEncoding;
 }
Example #21
0
 internal static RarHeader?TryReadBase(RarCrcBinaryReader reader, bool isRar5, ArchiveEncoding archiveEncoding)
 {
     try
     {
         return(new RarHeader(reader, isRar5, archiveEncoding));
     }
     catch (EndOfStreamException)
     {
         return(null);
     }
 }
Example #22
0
        internal static IEnumerable <TarHeader?> ReadHeader(StreamingMode mode, Stream stream, ArchiveEncoding archiveEncoding)
        {
            while (true)
            {
                TarHeader?header = null;
                try
                {
                    BinaryReader reader = new BinaryReader(stream);
                    header = new TarHeader(archiveEncoding);

                    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);
            }
        }
Example #23
0
 public DirectoryEntryHeader(ArchiveEncoding archiveEncoding)
     : base(ZipHeaderType.DirectoryEntry, archiveEncoding)
 {
 }
Example #24
0
 protected ZipFileEntry(ZipHeaderType type, ArchiveEncoding archiveEncoding)
     : base(type)
 {
     Extra           = new List <ExtraData>();
     ArchiveEncoding = archiveEncoding;
 }
Example #25
0
 internal static IEnumerable <TarEntry> GetEntries(StreamingMode mode, Stream stream,
                                                   CompressionType compressionType, ArchiveEncoding archiveEncoding)
 {
     foreach (TarHeader h in TarHeaderFactory.ReadHeader(mode, stream, archiveEncoding))
     {
         if (h != null)
         {
             if (mode == StreamingMode.Seekable)
             {
                 yield return(new TarEntry(new TarFilePart(h, stream), compressionType));
             }
             else
             {
                 yield return(new TarEntry(new TarFilePart(h, null), compressionType));
             }
         }
     }
 }
Example #26
0
        public static void ExportWord(string outputPath, string outputFile, IEnumerable <Datas> datases)
        {
            //先确定文件数
            //根据测区来分文件
            var           files    = datases.GroupBy(a => a.Regionalcode);
            var           datetime = DateTime.Now;
            string        date     = datetime.Year.ToString() + datetime.Month.ToString("00") + datetime.Day.ToString("00");
            List <string> outFiles = new List <string>();

            foreach (var f in files)
            {
                string filename = string.Format("{0}-加密锁授权申请表-{1}-{2}.doc", date, f.ElementAt(0).Compname, f.ElementAt(0).Regionalname);
                var    destFile = Path.Combine(outputPath, filename);

                outFiles.Add(destFile);              //将输出文件路径存放

                File.Copy(modelDoc, destFile, true); //复制文件
                var datas = f.ElementAt(0).Clone() as Datas;
                //合并软件名称
                string softs = string.Empty;
                var    gp    = f.GroupBy(a => a.Softwarename);
                foreach (var g in gp)
                {
                    softs += g.Key + ",";
                }
                softs = softs.TrimEnd(',');
                datas.Softwarename = softs;
                Document        doc = new Document(destFile);
                DocumentBuilder db  = new DocumentBuilder(doc);
                WriteDoc(doc, db, datas);
                //锁编号
                string dogCode = string.Empty;
                foreach (var d in f)
                {
                    dogCode += d.Dogcode + ";";
                }
                dogCode = dogCode.TrimEnd(';');
                db.MoveToBookmark("dogcode");
                var run = new Run(doc, dogCode);
                run.Font.Size  = 14;
                run.Font.Color = System.Drawing.Color.Blue;
                db.InsertNode(run);
                //备注
                string remark = string.Empty;
                //区分新领取和非新领取的
                var newget = f.Where(p => p.Servicetype.Contains("新领取"));
                var oldget = f.Except(newget);
                //处理新领取的情况
                var services = newget.GroupBy(a => a.Servicetype);
                foreach (var s in services)
                {
                    var softtypes = s.GroupBy(a => a.Softwarename);
                    foreach (var st in softtypes)
                    {
                        var dogt = st.GroupBy(a => a.Dogtype);
                        foreach (var d in dogt)
                        {
                            remark += string.Format("{0}{1}{2}个({3});", s.Key, d.Key, d.Count(), st.Key);
                        }
                    }
                }

                var dt = oldget.GroupBy(a => a.Dogtype);
                foreach (var d in dt)
                {
                    var st = d.GroupBy(a => a.Servicetype);
                    foreach (var s in st)
                    {
                        remark += string.Format("{0}{1}{2}个;", d.Key, s.Key, s.Count());
                    }
                }
                remark = remark.TrimEnd(';');
                db.MoveToBookmark("remark");
                db.InsertNode(new Run(doc, remark));
                doc.Save(destFile, Aspose.Words.SaveFormat.Doc);
            }
            //将文件压缩
            string output = Path.Combine(outputPath, outputFile);
            Stream dst    = new FileStream(output, FileMode.Create);
            //解决中文乱码问题
            ArchiveEncoding ArchiveEncoding = new ArchiveEncoding();

            ArchiveEncoding.Default = Encoding.GetEncoding("utf-8");
            SharpCompress.Writers.WriterOptions options = new SharpCompress.Writers.WriterOptions(CompressionType.Deflate);
            options.ArchiveEncoding = ArchiveEncoding;

            using (var archive = ZipArchive.Create())
            {
                foreach (var f in outFiles)
                {
                    FileInfo fi = new FileInfo(f);
                    archive.AddEntry(fi.Name, fi.OpenRead(), true);
                }
                archive.SaveTo(dst, options);
                dst.Close();
            }
            dst.Dispose();
            //删除生成的单个文件
            foreach (var f in outFiles)
            {
                File.Delete(f);
            }
        }
Example #27
0
 internal SevenZipFilePart(Stream stream, ArchiveDatabase database, int index, CFileItem fileEntry, ArchiveEncoding archiveEncoding)
     : base(archiveEncoding)
 {
     _stream   = stream;
     _database = database;
     Index     = index;
     Header    = fileEntry;
     if (Header.HasStream)
     {
         Folder = database._folders[database._fileIndexToFolderIndexMap[index]];
     }
 }
Example #28
0
        private void ReadFromReaderV4(MarkingBinaryReader reader)
        {
            Flags      = HeaderFlags;
            IsSolid    = HasFlag(FileFlagsV4.SOLID);
            WindowSize = IsDirectory ? 0U : ((size_t)0x10000) << ((Flags & FileFlagsV4.WINDOW_MASK) >> 5);

            uint lowUncompressedSize = reader.ReadUInt32();

            HostOs = reader.ReadByte();

            FileCrc = reader.ReadUInt32();

            FileLastModifiedTime = Utility.DosDateToDateTime(reader.ReadUInt32());

            CompressionAlgorithm = reader.ReadByte();
            CompressionMethod    = (byte)(reader.ReadByte() - 0x30);

            short nameSize = reader.ReadInt16();

            FileAttributes = reader.ReadUInt32();

            uint highCompressedSize    = 0;
            uint highUncompressedkSize = 0;

            if (HasFlag(FileFlagsV4.LARGE))
            {
                highCompressedSize    = reader.ReadUInt32();
                highUncompressedkSize = reader.ReadUInt32();
            }
            else
            {
                if (lowUncompressedSize == 0xffffffff)
                {
                    lowUncompressedSize   = 0xffffffff;
                    highUncompressedkSize = int.MaxValue;
                }
            }
            CompressedSize   = UInt32To64(highCompressedSize, checked ((uint)AdditionalDataSize));
            UncompressedSize = UInt32To64(highUncompressedkSize, lowUncompressedSize);

            nameSize = nameSize > 4 * 1024 ? (short)(4 * 1024) : nameSize;

            byte[] fileNameBytes = reader.ReadBytes(nameSize);

            const int saltSize   = 8;
            const int newLhdSize = 32;

            switch (HeaderCode)
            {
            case HeaderCodeV.RAR4_FILE_HEADER:
            {
                if (HasFlag(FileFlagsV4.UNICODE))
                {
                    int length = 0;
                    while (length < fileNameBytes.Length &&
                           fileNameBytes[length] != 0)
                    {
                        length++;
                    }
                    if (length != nameSize)
                    {
                        length++;
                        FileName = FileNameDecoder.Decode(fileNameBytes, length);
                    }
                    else
                    {
                        FileName = ArchiveEncoding.Decode(fileNameBytes);
                    }
                }
                else
                {
                    FileName = ArchiveEncoding.Decode(fileNameBytes);
                }
                FileName = ConvertPathV4(FileName);
            }
            break;

            case HeaderCodeV.RAR4_NEW_SUB_HEADER:
            {
                int datasize = HeaderSize - newLhdSize - nameSize;
                if (HasFlag(FileFlagsV4.SALT))
                {
                    datasize -= saltSize;
                }
                if (datasize > 0)
                {
                    SubData = reader.ReadBytes(datasize);
                }

                if (NewSubHeaderType.SUBHEAD_TYPE_RR.Equals(fileNameBytes))
                {
                    RecoverySectors = SubData[8] + (SubData[9] << 8)
                                      + (SubData[10] << 16) + (SubData[11] << 24);
                }
            }
            break;
            }

            if (HasFlag(FileFlagsV4.SALT))
            {
                R4Salt = reader.ReadBytes(saltSize);
            }
            if (HasFlag(FileFlagsV4.EXT_TIME))
            {
                // verify that the end of the header hasn't been reached before reading the Extended Time.
                //  some tools incorrectly omit Extended Time despite specifying FileFlags.EXTTIME, which most parsers tolerate.
                if (RemainingHeaderBytes(reader) >= 2)
                {
                    ushort extendedFlags = reader.ReadUInt16();
                    FileLastModifiedTime = ProcessExtendedTimeV4(extendedFlags, FileLastModifiedTime, reader, 0);
                    FileCreatedTime      = ProcessExtendedTimeV4(extendedFlags, null, reader, 1);
                    FileLastAccessedTime = ProcessExtendedTimeV4(extendedFlags, null, reader, 2);
                    FileArchivedTime     = ProcessExtendedTimeV4(extendedFlags, null, reader, 3);
                }
            }
        }
Example #29
0
 public TarHeader(ArchiveEncoding archiveEncoding)
 {
     ArchiveEncoding = archiveEncoding;
 }
Example #30
0
 public LocalEntryHeader(ArchiveEncoding archiveEncoding)
     : base(ZipHeaderType.LocalEntry, archiveEncoding)
 {
 }