Example #1
0
        /// <summary>
        ///
        /// </summary>
        /// <exception cref="ApplicationException"></exception>
        public void ExtractBin(string cueFileName)
        {
            if (!Directory.Exists(Directory.GetCurrentDirectory() + @"\" + _outFileNameBase))
            {
                Directory.CreateDirectory(Directory.GetCurrentDirectory() + @"\" + _outFileNameBase);
            }
            var save_dir = Directory.GetCurrentDirectory() + @"\" + _outFileNameBase;

            try
            {
                CueFile cueFile;
                try
                {
                    cueFileName = Path.ChangeExtension(cueFileName, CueExtension);
                    cueFile     = new CueFile(cueFileName);
                }
                catch (Exception e)
                {
                    throw new ApplicationException($"Could not read CUE {cueFileName}:\n{e.Message}");
                }

                Stream binStream;
                try
                {
                    File.Copy(cueFile.BinFileName, save_dir + @"\" + _outFileNameBase + ".bin");
                    binStream = File.OpenRead(cueFile.BinFileName);
                }
                catch (Exception e)
                {
                    throw new ApplicationException($"Could not open BIN {cueFile.BinFileName}: {e.Message}");
                }

                Console.WriteLine(Environment.NewLine + "Writing tracks:");
                foreach (Track curTrack in cueFile.TrackList)
                {
                    Console.WriteLine(curTrack.Modes);
                    Console.WriteLine(curTrack.FileExtension);
                    Console.WriteLine(cueFile.TrackList.Count);
                    // Include track number when more than 1 track.

                    if (cueFile.TrackList.Count > 1)
                    {
                        _outFileName =
                            $"{_outFileNameBase}{curTrack.TrackNumber:00}.{curTrack.FileExtension.ToString().ToLower()}";
                    }
                    else
                    {
                        _outFileName = $"{_outFileNameBase}.{curTrack.FileExtension.ToString().ToLower()}";
                    }
                    curTrack.Write(binStream, _outFileName);
                }
            }
            catch (Exception e)
            {
                Console.WriteLine(e.Message);
            }
            Console.WriteLine("discutils");
            using (FileStream isoStream = File.OpenRead(_outFileName))
            {
                CDReader cd = new CDReader(isoStream, false);
                Console.WriteLine(cd.Root.FullName);

                string[] files   = cd.GetFiles(cd.Root.FullName);
                string[] dirs    = cd.GetDirectories(cd.Root.FullName);
                bool     mrgdone = false;

                foreach (string c in files)
                {
                    Console.WriteLine(c);
                    if (c == @"\SLUS_014.11;1")
                    {
                        FileStream   fs  = File.Create(save_dir + @"\SLUS_014.11");
                        SparseStream isf = cd.OpenFile(c, FileMode.Open);
                        byte[]       dat = new byte[isf.Length];

                        int result = AsyncContext.Run(() => isf.ReadAsync(dat, 0, (int)isf.Length));

                        Task task = Task.Run(async() => { await fs.WriteAsync(dat, 0, dat.Length); });
                        task.Wait();
                        fs.Close();
                    }

                    foreach (string e in cd.GetFiles("\\DATA"))
                    {
                        Console.WriteLine(e);
                        if (e == @"\DATA\WA_MRG.MRG;1" && !mrgdone)
                        {
                            FileStream   fs     = File.Create(save_dir + @"\WA_MRG.MRG");
                            SparseStream isf    = cd.OpenFile(e, FileMode.Open);
                            byte[]       dat    = new byte[isf.Length];
                            int          result = AsyncContext.Run(() => isf.ReadAsync(dat, 0, (int)isf.Length));
                            Task         task   = Task.Run(async() => { await fs.WriteAsync(dat, 0, dat.Length); });
                            task.Wait();
                            mrgdone = true;
                            fs.Close();
                            break;
                        }
                    }

                    Static.SlusPath = save_dir + @"\SLUS_014.11";
                    Static.WaPath   = save_dir + @"\WA_MRG.MRG";
                    Static.IsoPath  = save_dir + @"\" + _outFileNameBase + ".bin";
                }
                isoStream.Close();
                File.Delete(_outFileName);
            }
        }