internal static bool ExtractXiso(XisoOptions opts, XisoListAndSize retval) { var br = new BinaryReader(File.Open(opts.Source, FileMode.Open, FileAccess.Read, FileShare.Read)); try { if (opts.GenerateSfv) { opts.SfvGen = new SfvGenerator(Path.Combine(Path.GetDirectoryName(opts.Source), Path.GetFileNameWithoutExtension(opts.Source)) + ".sfv"); } var ret = ExtractXiso(opts, retval, ref br); if (!ret || !opts.DeleteIsoOnCompletion) { return(ret); } br.Close(); File.Delete(opts.Source); return(true); } finally { br.Close(); } }
private static bool ExtractXiso(XisoOptions opts, XisoListAndSize retval, ref BinaryReader br) { _errorlevel = 0; if (opts.UseFtp && opts.FtpOpts.IsValid) { return(ExtractFiles(ref br, ref retval.List, opts.FtpOpts, opts)); } if (opts.UseFtp) { opts.Target = Path.Combine(Path.GetDirectoryName(opts.Source), Path.GetFileNameWithoutExtension(opts.Source)); } if (opts.GenerateSfv) { opts.SfvGen = new SfvGenerator(Path.Combine(Path.GetDirectoryName(opts.Source), Path.GetFileNameWithoutExtension(opts.Source)) + ".sfv"); } var space = GetTotalFreeSpace(opts.Target); if (space < 0) { UpdateStatus(string.Format("WARNING: Unable to get Total Free Space got: {0} We'll be extracting anyways...", space)); space = retval.Size * 100; // There was an error, try to extract anyways } if (space > retval.Size) { _totalSize = retval.Size; if (!ExtractFiles(ref br, ref retval.List, opts.Target, opts)) { return(false); } if (opts.GenerateSfv) { opts.SfvGen.Save(); } return(true); } _errorlevel = 5; UpdateStatus(string.Format("Extraction failed! (Not enough space on drive) space needed: {0} Space available: {1}", Utils.GetSizeReadable(retval.Size), Utils.GetSizeReadable(space))); return(false); }
internal static bool GetFileListAndSize(XisoOptions opts, out XisoListAndSize retval, out BinaryReader br) { Abort = false; if (opts.GenerateSfv) { opts.SfvGen = new SfvGenerator(Path.Combine(Path.GetDirectoryName(opts.Source), Path.GetFileNameWithoutExtension(opts.Source)) + ".sfv"); } retval = new XisoListAndSize(); br = null; _errorlevel = 1; if (!VerifyXiso(opts.Source)) { return(false); } br = new BinaryReader(File.Open(opts.Source, FileMode.Open, FileAccess.Read, FileShare.Read)); if (!BinarySeek(ref br, ((_baseOffset + 32) * 2048) + 0x14, 8)) { return(false); } var data = br.ReadBytes(8); UpdateOperation("Grabbing Root sector & offset..."); uint rootsector; _errorlevel = int.MaxValue; if (!EndianConverter.Little32(ref data, out rootsector)) { return(false); } uint rootsize; if (!EndianConverter.Little32(ref data, out rootsize, 4)) { return(false); } UpdateStatus(string.Format("Root sector: {0} (0x{0:X}) Root size: {1} (0x{1:X})", rootsector, rootsize)); UpdateOperation("Parsing Game Partition FS Table..."); Parse(ref br, ref retval.List, 0, 0, rootsector); _totalProcessed = 0; _totalSize = 0; var msg = ""; var newlist = new List <XisoTableData>(); foreach (var entry in retval.List) { if (opts.ExcludeSysUpdate && entry.Path.IndexOf("$SystemUpdate", StringComparison.CurrentCultureIgnoreCase) != -1 || entry.Name.IndexOf("$SystemUpdate", StringComparison.CurrentCultureIgnoreCase) != -1) { continue; } if (entry.IsFile) { if (opts.GenerateFileList) { msg += string.Format("{0}{1} [Offset: 0x{2:X} Size: {3}]{4}", entry.Path, entry.Name, entry.Offset, Utils.GetSizeReadable(entry.Size), Environment.NewLine); } _totalSize += entry.Size; retval.Files++; } else { if (opts.GenerateFileList) { msg += string.Format("{0}{1}\\{2}", entry.Path, entry.Name, Environment.NewLine); } retval.Folders++; } newlist.Add(entry); } retval.List = newlist; UpdateStatus(string.Format("Parsing Game Partition FS Table done! Total entries found: {0} Files: {1} Folders: {2} Total File size: {3}", retval.List.Count, retval.Files, retval.Folders, Utils.GetSizeReadable(_totalSize))); if (opts.GenerateFileList) { msg = string.Format("Total entries: {0}{4}Folders: {1}{4}Files: {2}{4}Total Filesize: {5}{4}{3}", retval.List.Count, retval.Folders, retval.Files, msg, Environment.NewLine, Utils.GetSizeReadable(_totalSize)); File.WriteAllText(string.Format("{0}\\{1}.txt", Path.GetDirectoryName(opts.Source), Path.GetFileNameWithoutExtension(opts.Source)), msg); } if (string.IsNullOrEmpty(opts.Target)) { opts.Target = string.Format("{0}\\{1}", Path.GetDirectoryName(opts.Source), Path.GetFileNameWithoutExtension(opts.Source)); } if (opts.Target.EndsWith("\\", StringComparison.Ordinal)) { opts.Target = opts.Target.Substring(0, opts.Target.Length - 1); } retval.Size = _totalSize; return(true); }
private void MultiExtractDoWork(object sender, DoWorkEventArgs e) { var sw = new Stopwatch(); sw.Start(); if (!(e.Argument is List <BwArgs>)) { e.Cancel = true; return; } var args = e.Argument as List <BwArgs>; XisoExtractor.MultiSize = 0; var list = new XisoListAndSize[args.Count]; for (var i = 0; i < args.Count; i++) { if (XisoExtractor.Abort) { return; } BinaryReader br; XisoExtractor.UpdateStatus(string.Format("Getting information about {0}", args[i].Source)); args[i].Result = XisoExtractor.GetFileListAndSize(new XisoOptions { Source = args[i].Source, Target = args[i].Target, ExcludeSysUpdate = args[i].SkipSystemUpdate, GenerateFileList = args[i].GenerateFileList, GenerateSfv = args[i].GenerateSfv, UseFtp = args[i].UseFtp, FtpOpts = args[i].FtpSettings, DeleteIsoOnCompletion = args[i].DeleteIsoOnCompletion }, out list[i], out br); if (br != null) { br.Close(); } if (args[i].Result) { XisoExtractor.MultiSize += list[i].Size; } args[i].ErrorMsg = XisoExtractor.GetLastError(); GC.Collect(); } for (var i = 0; i < args.Count; i++) { if (XisoExtractor.Abort) { return; } if (!args[i].Result) { continue; } args[i].Result = XisoExtractor.ExtractXiso(new XisoOptions { Source = args[i].Source, Target = args[i].Target, ExcludeSysUpdate = args[i].SkipSystemUpdate, GenerateFileList = args[i].GenerateFileList, GenerateSfv = args[i].GenerateSfv, UseFtp = args[i].UseFtp, FtpOpts = args[i].FtpSettings, DeleteIsoOnCompletion = args[i].DeleteIsoOnCompletion }, list[i]); args[i].ErrorMsg = XisoExtractor.GetLastError(); } var failed = 0; foreach (var result in args) { if (!result.Result) { failed++; } } e.Result = failed == 0 ? (object)true : args; sw.Stop(); XisoExtractorOnOperation(null, new EventArg <string>(string.Format("Completed Queue after {0:F0} Minute(s) and {1} Second(s)", sw.Elapsed.TotalMinutes, sw.Elapsed.Seconds))); XisoExtractorOnStatus(null, new EventArg <string>(string.Format("Completed Queue after {0:F0} Minute(s) and {1} Second(s)", sw.Elapsed.TotalMinutes, sw.Elapsed.Seconds))); }