public void ExtractFile(string qbFilename, Stream stream)
{
//open input pak
string fname;
long offset;
if (_pakHeaders.ContainsKey(qbFilename.ToLower()))
{
PakHeaderItem phi = _pakHeaders[qbFilename.ToLower()];
//open output
if (_debugFile)
{
fname = _pakFormat.FullDebugFilename;
offset = phi.HeaderStart + phi.FileOffset;
}
else if (_requiresPab)
{
fname = _pakFormat.FullPabFilename;
offset = (phi.HeaderStart + phi.FileOffset) - (new FileInfo(_pakFormat.FullPakFilename)).Length;
}
else
{
fname = _pakFormat.FullPakFilename;
offset = phi.HeaderStart + phi.FileOffset;
}
using (BinaryWriter bw = new BinaryWriter(stream))
{
//open input pak
using (FileStream fsPak = File.Open(fname, FileMode.Open, FileAccess.ReadWrite))
{
if ((offset + phi.FileLength) - 1 > fsPak.Length)
throw new ApplicationException(string.Format("End of file '{0}' is located at 0x{1} which is beyond the PAK/PAB size 0x{2}", qbFilename, (offset + phi.FileLength).ToString("X").PadLeft(8, '0'), fsPak.Length.ToString("X").PadLeft(8, '0')));
using (BinaryReader brPak = new BinaryReader(fsPak))
{
fsPak.Seek(offset, SeekOrigin.Begin);
copyData(fsPak, stream, (long)phi.FileLength);
}
}
}
}
else
throw new ApplicationException(string.Format("'{0}' does not exist in '{1}'", qbFilename, _pakFilename));
}