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); }