private PakHeaderItem createBlankFile(string newQbFilename, QbKey itemType, bool filenameInHeader)
{
//update the filename in the collection
List<PakHeaderItem> hd = new List<PakHeaderItem>(_pakHeaders.Values);
PakHeaderItem newHdr = new PakHeaderItem();
newHdr.FileLength = 0; // (uint)(new FileInfo(localFilename)).Length;
newHdr.FileOffset = hd[0].FileOffset + (uint)(filenameInHeader ? PakHeaderItem.FullHeaderLength : 0x20);
newHdr.Flags = (PakHeaderFlags)(filenameInHeader ? PakHeaderFlags.Filename : 0);
newHdr.HeaderStart = 0;
newHdr.IsStoredInPak = true;
newHdr.Filename = newQbFilename;
newHdr.FileType = itemType;
hd.Insert(0, newHdr);
//update the filename in the collection
bool pastNew = false;
Dictionary<string, PakHeaderItem> p = new Dictionary<string, PakHeaderItem>(_pakHeaders.Count);
bool hasFoundMatch = filenameInHeader;
foreach (PakHeaderItem ph in hd)
{
//small hack to determine which items need to be filled - Find another header with
if (!hasFoundMatch && ((ph.Flags & PakHeaderFlags.Filename) != PakHeaderFlags.Filename) && ph != newHdr)
{
newHdr.SetFilename(newQbFilename, itemType, _pakFormat.FileExtension, ph);
hasFoundMatch = true;
}
if (pastNew)
ph.HeaderStart += (uint)(filenameInHeader ? PakHeaderItem.FullHeaderLength : 0x20);
else if (ph != newHdr)
ph.FileOffset += (uint)(filenameInHeader ? PakHeaderItem.FullHeaderLength : 0x20);
else // (ph == newHdr)
pastNew = true;
p.Add(ph.Filename.ToLower(), ph);
}
if (!hasFoundMatch)
newHdr.SetFilename(newQbFilename, itemType, _pakFormat.FileExtension, null);
_pakFileLength += (uint)(filenameInHeader ? PakHeaderItem.FullHeaderLength : PakHeaderItem.FullHeaderLength - PakHeaderItem.FileNameMaxLength);
_pakHeaders = p;
string newPakFilename = string.Format("{0}_{1}", _pakFilename, Guid.NewGuid().ToString("N"));
using (FileStream fsO = File.Open(newPakFilename, FileMode.CreateNew))
{
using (BinaryEndianWriter bw = new BinaryEndianWriter(fsO))
{
writeHeaderItem(bw, newHdr);
using (FileStream fsI = File.OpenRead(_pakFilename))
copyData(fsI, fsO, new FileInfo(_pakFilename).Length);
}
}
File.Delete(_pakFilename);
File.Move(newPakFilename, _pakFilename);
return newHdr;
}