public override bool DetectROM(string inputPath, out string titleID, out uint regionID) { bool found = false; titleID = null; regionID = 0; using (FileStream isoStream = File.Open(inputPath, FileMode.Open)) { CDReader cd; FileStream tempbin = null; if (Path.GetExtension(inputPath).ToLower() == ".bin") // PS1 CD image { FileStream binconvout = new FileStream(ModLoaderGlobals.BaseDirectory + "binconvout.iso", FileMode.Create, FileAccess.Write); PSX2ISO.Run(isoStream, binconvout); binconvout.Close(); tempbin = new FileStream(ModLoaderGlobals.BaseDirectory + "binconvout.iso", FileMode.Open, FileAccess.Read); cd = new CDReader(tempbin, true); } else if (!CDReader.Detect(isoStream)) { return(false); } else { cd = new CDReader(isoStream, true); } if (cd.FileExists(@"SYSTEM.CNF")) { using (StreamReader sr = new StreamReader(cd.OpenFile(@"SYSTEM.CNF", FileMode.Open))) { titleID = sr.ReadLine(); found = (titleID.Contains("BOOT ") || titleID.Contains("BOOT=")); } } else { found = false; } cd.Dispose(); if (tempbin != null) { tempbin.Dispose(); File.Delete(ModLoaderGlobals.BaseDirectory + "binconvout.iso"); } } if (!found) { titleID = null; } return(found); }
public override void Extract(string inputPath, string outputPath) { //Needed to build File.Copy(inputPath, ModLoaderGlobals.ToolsPath + "Game.iso"); using (FileStream isoStream = File.Open(inputPath, FileMode.Open)) { FileInfo isoInfo = new FileInfo(inputPath); CDReader cd; FileStream tempbin = null; if (Path.GetExtension(inputPath).ToLower() == ".bin") { FileStream binconvout = new FileStream(ModLoaderGlobals.BaseDirectory + "binconvout.iso", FileMode.Create, FileAccess.Write); PSX2ISO.Run(isoStream, binconvout); binconvout.Close(); tempbin = new FileStream(ModLoaderGlobals.BaseDirectory + "binconvout.iso", FileMode.Open, FileAccess.Read); cd = new CDReader(tempbin, true); } else { cd = new CDReader(isoStream, true); } //ModLoaderGlobals.ISO_Label = cd.VolumeLabel; /* Sometimes doesn't work? * if (isoInfo.Length * 2 > GetTotalFreeSpace(ModLoaderGlobals.TempPath.Substring(0, 3))) * { * cd.Dispose(); * throw new IOException("Extraction error: Not enough hard drive space where this program is!"); * } * if (isoInfo.Length * 2 > GetTotalFreeSpace(ModLoaderGlobals.OutputPath.Substring(0, 3))) * { * cd.Dispose(); * throw new IOException("Extraction error: Not enough hard drive space in the output path!"); * } */ //fileStream = cd.OpenFile(@"SYSTEM.CNF", FileMode.Open); if (!Directory.Exists(outputPath)) { Directory.CreateDirectory(outputPath); } //Extracting ISO Stream fileStreamFrom = null; Stream fileStreamTo = null; if (cd.GetDirectories("").Length > 0) { foreach (string directory in cd.GetDirectories("")) { Directory.CreateDirectory(outputPath + directory); if (cd.GetDirectoryInfo(directory).GetFiles().Length > 0) { foreach (string file in cd.GetFiles(directory)) { fileStreamFrom = cd.OpenFile(file, FileMode.Open); string filename = outputPath + file; filename = filename.Replace(";1", string.Empty); fileStreamTo = File.Open(filename, FileMode.OpenOrCreate); fileStreamFrom.CopyTo(fileStreamTo); fileStreamFrom.Close(); fileStreamTo.Close(); } } if (cd.GetDirectories(directory).Length > 0) { Recursive_CreateDirs(cd, directory, fileStreamFrom, fileStreamTo); } } } if (cd.GetDirectoryInfo("").GetFiles().Length > 0) { foreach (string file in cd.GetFiles("")) { fileStreamFrom = cd.OpenFile(file, FileMode.Open); string filename = outputPath + "/" + file; filename = filename.Replace(";1", string.Empty); fileStreamTo = File.Open(filename, FileMode.OpenOrCreate); fileStreamFrom.CopyTo(fileStreamTo); fileStreamFrom.Close(); fileStreamTo.Close(); } } cd.Dispose(); if (tempbin != null) { tempbin.Dispose(); File.Delete(ModLoaderGlobals.BaseDirectory + "binconvout.iso"); } } }