protected override void DoTaskForFile(string pPath, IVgmtWorkerStruct pPsf2SettingsUpdaterStruct, DoWorkEventArgs e) { Psf2SettingsUpdaterStruct iniStruct = (Psf2SettingsUpdaterStruct)pPsf2SettingsUpdaterStruct; string workingFolder = String.Empty; ////////////////////// // copy existing tags ////////////////////// string formatString = XsfUtil.GetXsfFormatString(pPath); Dictionary <string, string> tagHash; Xsf psf2File, newPsf2File; if (!String.IsNullOrEmpty(formatString) && formatString.Equals(Xsf.FormatNamePsf2)) { try { using (FileStream fs = File.Open(pPath, FileMode.Open, FileAccess.Read)) { // initialize file psf2File = new Xsf(); psf2File.Initialize(fs, pPath); // copy tags tagHash = psf2File.GetTagHash(); } /////////////// // unpack Psf2 /////////////// workingFolder = Path.Combine(Path.GetDirectoryName(pPath), Path.GetFileNameWithoutExtension(pPath)); string unpackFolder = Path.Combine(workingFolder, "unpack_dir"); XsfUtil.UnpackPsf2(pPath, unpackFolder); /////////////////// // parse .ini file /////////////////// Psf2.Psf2IniSqIrxStruct originalIni; string[] originalIniFiles = Directory.GetFiles(unpackFolder, "*.ini"); if (originalIniFiles.Length > 0) { using (FileStream iniFs = File.Open(originalIniFiles[0], FileMode.Open, FileAccess.Read)) { originalIni = Psf2.ParseClsIniFile(iniFs); } //////////////////// // update .ini file //////////////////// iniStruct.IniSettings = UpdateClsIniFile(iniStruct.IniSettings, originalIni, iniStruct.RemoveEmptySettings); File.Delete(originalIniFiles[0]); Psf2.WriteClsIniFile(iniStruct.IniSettings, originalIniFiles[0]); /////////////// // repack Psf2 /////////////// string psf2FileName = Path.GetFileName(pPath); /////////////////// // copy mkpsf2.exe /////////////////// string mkpsf2Destination = Path.Combine(workingFolder, Path.GetFileName(MKPSF2_SOURCE_PATH)); File.Copy(MKPSF2_SOURCE_PATH, mkpsf2Destination, true); ////////////////// // run mkpsf2.exe ////////////////// string arguments = String.Format(" \"{0}\" \"{1}\"", psf2FileName, unpackFolder); Process makePsf2Process = new Process(); makePsf2Process.StartInfo = new ProcessStartInfo(mkpsf2Destination, arguments); makePsf2Process.StartInfo.UseShellExecute = false; makePsf2Process.StartInfo.CreateNoWindow = true; makePsf2Process.StartInfo.WorkingDirectory = workingFolder; bool isSuccess = makePsf2Process.Start(); makePsf2Process.WaitForExit(); makePsf2Process.Close(); makePsf2Process.Dispose(); //////////////// // replace tags //////////////// string newPsf2FilePath = Path.Combine(workingFolder, psf2FileName); using (FileStream newFs = File.Open(newPsf2FilePath, FileMode.Open, FileAccess.Read)) { // initialize new file newPsf2File = new Xsf(); newPsf2File.Initialize(newFs, newPsf2FilePath); } // update to use old tag hash newPsf2File.TagHash = tagHash; newPsf2File.UpdateTags(); ///////////////////////// // replace original file ///////////////////////// File.Copy(newPsf2FilePath, pPath, true); } } catch (Exception ex) { throw ex; } finally { // delete working folder if (Directory.Exists(workingFolder)) { Directory.Delete(workingFolder, true); } } } }
private bool moveNonIniFiles(string pSourceDirectory, string pDestinationDirectory) { bool isSuccess = true; Crc32 crc32Generator = new Crc32(); string fileDestinationPath; string fileExtension; string fileName; Psf2.Psf2IniSqIrxStruct psf2IniStruct; if (!Directory.Exists(pDestinationDirectory)) { Directory.CreateDirectory(pDestinationDirectory); } // get .ini and parse string iniPath = Path.Combine(pSourceDirectory, "psf2.ini"); using (FileStream fs = File.OpenRead(iniPath)) { psf2IniStruct = Psf2.ParseClsIniFile(fs); fs.Close(); } foreach (string f in Directory.GetFiles(pSourceDirectory, "*.*", SearchOption.AllDirectories)) { fileDestinationPath = String.Empty; // check if it is one of the SQ/BD/HD files fileName = Path.GetFileName(f).ToUpper(); fileExtension = Path.GetExtension(f).ToUpper(); if (fileName.Equals(Path.GetFileName(psf2IniStruct.BdFileName))) { psf2IniStruct.BdFileName = this.getFileNameForChecksum(f, BD_HASH_KEY) + Psf2.FILE_EXTENSION_BD; fileDestinationPath = Path.Combine(pDestinationDirectory, psf2IniStruct.BdFileName); } else if (fileName.Equals(Path.GetFileName(psf2IniStruct.HdFileName))) { psf2IniStruct.HdFileName = this.getFileNameForChecksum(f, HD_HASH_KEY) + Psf2.FILE_EXTENSION_HD; fileDestinationPath = Path.Combine(pDestinationDirectory, psf2IniStruct.HdFileName); } else if (fileName.Equals(Path.GetFileName(psf2IniStruct.SqFileName))) { psf2IniStruct.SqFileName = this.getFileNameForChecksum(f, SQ_HASH_KEY) + Psf2.FILE_EXTENSION_SQ; fileDestinationPath = Path.Combine(pDestinationDirectory, psf2IniStruct.SqFileName); } else if (fileExtension != ".INI") { fileDestinationPath = Path.Combine(pDestinationDirectory, Path.GetFileName(f)); } if (!String.IsNullOrEmpty(fileDestinationPath)) { try { File.Copy(f, fileDestinationPath, true); } catch (Exception _e) { isSuccess = false; int progress = (fileCount * 100) / maxFiles; this.progressStruct.Clear(); this.progressStruct.ErrorMessage = String.Format("Error processing <{0}>. Error received: ", f) + _e.Message; ReportProgress(progress, this.progressStruct); break; } File.Delete(f); } } // rebuild .ini file Psf2.WriteClsIniFile(psf2IniStruct, iniPath); return(isSuccess); }