/// <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)); }
/// <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); } }
/// <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)); }
//添加一个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); }