コード例 #1
0
        public static Archive ReadArchive(string path, IHashService _hashService)
        {
            var ar = new Archive()
            {
                ArchiveAbsolutePath = path
            };

            using var mmf = MemoryMappedFile.CreateFromFile(path, FileMode.Open);


            // read header
            uint customDataLength = 0;

            using (var vs = mmf.CreateViewStream(0, Header.EXTENDED_SIZE, MemoryMappedFileAccess.Read))
                using (var br = new BinaryReader(vs))
                {
                    ar.Header        = ReadHeader(br);
                    customDataLength = br.ReadUInt32();
                }

            // read custom
            try
            {
                if (customDataLength != 0)
                {
                    using var vs = mmf.CreateViewStream(Header.EXTENDED_SIZE, customDataLength, MemoryMappedFileAccess.Read);
                    using var br = new BinaryReader(vs);
                    if (br.BaseStream.Length >= LxrsFooter.MIN_LENGTH)
                    {
                        var lxrs = br.ReadLxrsFooter(_hashService);
                        foreach (var s in lxrs.FileInfos)
                        {
                            _hashService.Add(s);
                        }
                    }
                }
            }
            catch (UnauthorizedAccessException)
            {
                //Console.WriteLine(e);
            }

            // read files
            using (var vs = mmf.CreateViewStream((long)ar.Header.IndexPosition, ar.Header.IndexSize,
                                                 MemoryMappedFileAccess.Read))
                using (var br = new BinaryReader(vs))
                {
                    ar.Index = ReadIndex(br, _hashService);
                }

            foreach (var file in ar.Index.FileEntries.Values)
            {
                file.Archive = ar;
                ar.Files.Add(file.Key, file);
            }

            return(ar);
        }