Example #1
0
        public Stream OpenFile(string path)
        {
            var entry = GetEntry(path);

            if (entry == null)
            {
                throw new FileNotFoundException();
            }

            lock (this)
            {
                if (!_streams.ContainsKey(entry.ArchiveIndex))
                {
                    var file   = _directory.Chunks[entry.ArchiveIndex];
                    var stream = _directory.OpenFile(file);
                    _streams.Add(entry.ArchiveIndex, stream);
                }
            }

            var offset = entry.ArchiveIndex == VpkDirectory.DirectoryIndex ? _directory.HeaderLength + _directory.TreeLength + entry.EntryOffset : entry.EntryOffset;
            var sub    = new SubStream(_streams[entry.ArchiveIndex], offset, entry.EntryLength);

            return(new BufferedStream(new VpkEntryStream(entry, sub)));
        }