Esempio n. 1
0
        /// <summary>
        /// 从当前所有MPQ文件中读取指定文件
        /// </summary>
        /// <param name="filename"></param>
        /// <returns></returns>
        public byte[] ReadData(string filename)
        {
            MPQEntry entry = null;

            if (!this.mpqEntries.TryGetValue(filename, out entry))
            {
                return(null);
            }

            return(entry.File.ReadFile(filename));
        }
Esempio n. 2
0
        /// <summary>
        /// 读取MPQ包中所有文件信息
        /// </summary>
        private void readEntries()
        {
            int enriesCount = this.header.entriesCount;

            for (int i = 0; i < enriesCount; i++)
            {
                MPQEntry entry = new MPQEntry();
                entry.Read(this.stream);
                entry.File = this;
                log.Debug("read a entry file:" + entry.key + ";hashA:" + entry.hashA + ";hashB:" + entry.hashB);
                this.entries.Add(entry);
            }
        }
Esempio n. 3
0
        /// <summary>
        /// 从MPQ中读取文件数据
        /// </summary>
        /// <param name="filename"></param>
        /// <returns></returns>
        public byte[] ReadFile(string filename)
        {
            MPQEntry entry = this.getEntry(filename);

            if (entry == null)
            {
                log.Error("the file is not in mpq:" + filename);
                return(null);
            }

            int offset = this.header.blocksOffset + entry.fileOffset;

            this.stream.Seek(offset);
            return(this.stream.ReadBytes(entry.fileSize));
        }
Esempio n. 4
0
        //添加一个entry,注意新老覆盖
        private bool putEntry(MPQEntry entry)
        {
            MPQEntry old = null;

            if (!this.mpqEntries.TryGetValue(entry.key, out old))
            {
                this.mpqEntries[entry.key] = entry;
                return(true);
            }

            if (old.fileDate < entry.fileDate)
            {
                this.mpqEntries[entry.key] = entry;
                return(true);
            }

            return(false);
        }