public SetFilename ( string newFullQbFilename, |
||
newFullQbFilename | string | Full QB filename |
itemType | ||
extension | string | .ngc for Wii for example |
baseOn | base the qbKeys that are present on the passed item | |
return | void |
/// <summary> /// Rename the filename, this does not set the fileid for all the qb types /// </summary> /// <param name="qbFilename">Source full filename.</param> /// <param name="newFullQbFilename">Full QB filename</param> /// <param name="fileType">.qb or .sqb=QB, .mqb=mid, .img=img .dbg=dbg etc</param> /// <param name="extension">.qb.ngc for Wii for example</param> public void RenameFile(string qbFilename, string newQbFilename, QbKey itemType) { PakHeaderItem phi = _pakHeaders[qbFilename.ToLower()]; phi.SetFilename(newQbFilename, itemType, _pakFormat.FileExtension, phi); using (BinaryEndianWriter bw = new BinaryEndianWriter(File.OpenWrite(_pakFormat.FullPakFilename))) { bw.BaseStream.Seek(phi.HeaderStart, SeekOrigin.Begin); writeHeaderItem(bw, phi); } //update the filename in the collection Dictionary <string, PakHeaderItem> p = new Dictionary <string, PakHeaderItem>(_pakHeaders.Count); foreach (PakHeaderItem ph in _pakHeaders.Values) { p.Add(ph.Filename.ToLower(), ph); } _pakHeaders = p; if (phi.PakFileType == PakItemType.Qb || phi.PakFileType == PakItemType.Sqb || phi.PakFileType == PakItemType.Midi) { try { QbFile qbf = ReadQbFile(newQbFilename); qbf.SetNewFileId(); ReplaceFile(newQbFilename, qbf); } catch { } } }
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); }
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; }