Beispiel #1
0
        void LoadContent()
        {
            SpanReader reader;

            foreach (var collectionFile in _fileCollection.Enumerate())
            {
                reader = new SpanReader(collectionFile.GetExclusiveReader());
                if (!reader.CheckMagic(MagicStartOfFile))
                {
                    continue;                                       // Don't touch files alien files
                }
                var fileType = (DiskChunkFileType)reader.ReadUInt8();
                var fileInfo = fileType switch
                {
                    DiskChunkFileType.HashIndex => new FileHashIndex(ref reader),
                    DiskChunkFileType.PureValues => new FilePureValues(ref reader),
                    _ => UnknownFile.Instance
                };
                if (_fileGeneration < fileInfo.Generation)
                {
                    _fileGeneration = fileInfo.Generation;
                }
                _fileInfos.TryAdd(collectionFile.Index, fileInfo);
            }
            var hashFilePair =
                _fileInfos.Where(f => f.Value.FileType == DiskChunkFileType.HashIndex).OrderByDescending(
                    f => f.Value.Generation).FirstOrDefault();

            if (hashFilePair.Value == null)
            {
                return;
            }
            reader = new SpanReader(_fileCollection.GetFile(hashFilePair.Key).GetExclusiveReader());
            FileHashIndex.SkipHeader(ref reader);
            if (((FileHashIndex)hashFilePair.Value).KeySize != _keySize)
            {
                return;
            }
            var keyBuf = ByteBuffer.NewSync(new byte[_keySize]);

            while (true)
            {
                var cacheValue = new CacheValue();
                cacheValue.FileOfs = reader.ReadVUInt32();
                if (cacheValue.FileOfs == 0)
                {
                    break;
                }
                cacheValue.FileId        = reader.ReadVUInt32();
                cacheValue.AccessRate    = reader.ReadVUInt32();
                cacheValue.ContentLength = reader.ReadVUInt32();
                reader.ReadBlock(keyBuf);
                _cache.TryAdd(new ByteStructs.Key20(keyBuf), cacheValue);
            }
        }