コード例 #1
0
        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();
            }
        }
コード例 #2
0
        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);
        }
コード例 #3
0
        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);
        }
コード例 #4
0
        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)));
        }