private void LoadPluginData(FileStream fs, bool headerOnly, string[] recFilter) //LoadPluginData(BinaryReader br, bool headerOnly, string[] recFilter) { bool oldHoldUpdates = HoldUpdates; SnipStreamWrapper snipStreamWrapper = null; try { ZLibWrapper.AllocateBuffers(); RecordsTace.InitListOfRecords(); snipStreamWrapper = new SnipStreamWrapper(fs); //BinaryReader br = new BinaryReader(fs); string s; uint recsize; bool IsOblivion = false; this.Filtered = recFilter != null && recFilter.Length > 0; HoldUpdates = true; s = ReadRecName(snipStreamWrapper.ReadBytes(4)); //s = ReadRecName(br); if (s != "TES4") { throw new Exception("File is not a valid TES4 plugin (Missing TES4 record)"); } // Check for file version by checking the position of the HEDR field in the file. (ie. how big are the record header.) snipStreamWrapper.JumpTo(20, SeekOrigin.Begin); //br.BaseStream.Position = 20; s = ReadRecName(snipStreamWrapper.ReadBytes(4)); //s = ReadRecName(br); if (s == "HEDR") { // Record Header is 20 bytes IsOblivion = true; } else { s = ReadRecName(snipStreamWrapper.ReadBytes(4)); //s = ReadRecName(br); if (s != "HEDR") { throw new Exception("File is not a valid TES4 plugin (Missing HEDR subrecord in the TES4 record)"); } // Record Header is 24 bytes. Or the file is illegal } snipStreamWrapper.JumpTo(4, SeekOrigin.Begin); //br.BaseStream.Position = 4; recsize = snipStreamWrapper.ReadUInt32(); //recsize = br.ReadUInt32(); try { this.AddRecord(new Record("TES4", recsize, snipStreamWrapper, IsOblivion)); } catch (Exception e) { MessageBox.Show(e.Message); } if (!headerOnly) { while (!snipStreamWrapper.Eof()) //while (br.PeekChar() != -1) { s = ReadRecName(snipStreamWrapper.ReadBytes(4)); //s = ReadRecName(br); recsize = snipStreamWrapper.ReadUInt32(); //recsize = br.ReadUInt32(); if (s == "GRUP") { try { this.AddRecord(new GroupRecord(recsize, snipStreamWrapper, IsOblivion, recFilter, false)); //this.AddRecord(new GroupRecord(recsize, br, IsOblivion, recFilter, false)); } catch (Exception e) { MessageBox.Show(e.Message); } } else { bool skip = recFilter != null && Array.IndexOf(recFilter, s) >= 0; if (skip) { long size = recsize + (IsOblivion ? 8 : 12); if ((snipStreamWrapper.ReadUInt32() & 0x00040000) > 0) //if ((br.ReadUInt32() & 0x00040000) > 0) { size += 4; // Add 4 bytes for compressed record since the decompressed size is not included in the record size. } snipStreamWrapper.JumpTo((int)size, SeekOrigin.Current); //br.BaseStream.Position += size; // just position past the data } else { try { this.AddRecord(new Record(s, recsize, snipStreamWrapper, IsOblivion)); //this.AddRecord(new Record(s, recsize, br, IsOblivion)); } catch (Exception e) { MessageBox.Show(e.Message); } } } } } } finally { snipStreamWrapper.CloseAndDisposeFileStream(); snipStreamWrapper = null; Clipboard.SetText("CompressedRecords:" + Environment.NewLine + string.Join <string>(string.Empty, RecordsTace.CompressedRecords) + "AllRecords:" + Environment.NewLine + string.Join <string>(string.Empty, RecordsTace.AllRecords) + "Max Size:" + ZLibWrapper.MaxOutputBufferPosition.ToString(CultureInfo.InvariantCulture)); ZLibWrapper.ReleaseBuffers(); ZLib.ReleaseInflater(); HoldUpdates = oldHoldUpdates; FireRecordListUpdate(this, this); } }
internal void Save(string filePath) { UpdateRecordCount(); string extension = string.Empty; //BinaryWriter bw; SnipStreamWrapper snipStreamWrapper = null; string tmpFile = filePath + ".new"; //if (File.Exists(filePath)) //{ // //bw = new BinaryWriter(File.OpenWrite(filePath + ".new")); // //extension = ".new"; //} //else //{ // //bw = new BinaryWriter(File.OpenWrite(filePath)); // fs = new FileStream(filePath, FileMode.Open, FileAccess.Write); //} //fs = new FileStream(filePath + extension, FileMode.Open, FileAccess.Write); //bw = new BinaryWriter(File.OpenWrite(filePath + extension)); //bw = new BinaryWriter(File.OpenWrite(tmpFile)); FileStream fs = new FileStream(tmpFile, FileMode.Create, FileAccess.Write, FileShare.None); try { ZLibWrapper.AllocateBuffers(); snipStreamWrapper = new SnipStreamWrapper(fs); snipStreamWrapper.AllocateBuffers(); this.SaveData(snipStreamWrapper); Name = Path.GetFileName(filePath); PluginPath = Path.GetDirectoryName(filePath); } finally { //bw.Close(); snipStreamWrapper.CloseAndDisposeFileStream(); snipStreamWrapper.ReleaseBuffers(); snipStreamWrapper = null; fs = null; } try { // ** Create Backup bool backupExists = true; int backupVersion = 0; string backupFolder = CreateBackupFolder(filePath); while (backupExists && backupVersion < 999) { backupExists = File.Exists(Path.Combine(backupFolder, Name) + string.Format(".{0,3:D3}.bak", backupVersion)); if (backupExists) { backupVersion++; } } string backupFile = Path.Combine(backupFolder, Name) + string.Format(".{0,3:D3}.bak", backupVersion); File.Copy(tmpFile, backupFile, true); //if (existed) //{ ////string newFile = filePath; //string backupFile = Path.Combine(backupFolder, Name) + string.Format(".{0,3:D3}.bak", backupVersion); //File.Copy(tmpFile, backupFile, true); if (File.Exists(filePath)) { File.Delete(filePath); } File.Move(tmpFile, filePath); //} } catch (Exception ex) { string msg = string.Format(ex.Message); MessageBox.Show( msg, TranslateUI.TranslateUiGlobalization.ResManager.GetString("Application_Title"), MessageBoxButtons.OK, MessageBoxIcon.Error); Clipboard.SetText(msg); } var tes4 = this.Records.OfType <Record>().FirstOrDefault(x => x.Name == "TES4"); if (tes4 != null && (tes4.Flags1 & 0x80) != 0) { if (Properties.Settings.Default.SaveStringsFiles) { string prefix = Path.Combine(Path.Combine(Path.GetDirectoryName(filePath), "Strings"), Path.GetFileNameWithoutExtension(filePath)); prefix += "_" + Properties.Settings.Default.LocalizationName; this.SaveStrings(prefix); } } StringsDirty = false; }