Example #1
0
        static public void ExtractIso(string isoPath, string targetDir)
        {
            using (FileStream isoStream = File.Open(isoPath, FileMode.Open, System.IO.FileAccess.Read))
            {
                CDReader       cd   = new CDReader(isoStream, true);
                Stack <string> dirs = new Stack <string>(20);
                string         root = @"\";
                dirs.Push(root);
                while (dirs.Count > 0)
                {
                    string currentDir = dirs.Pop();
                    Debug.WriteLine($"Scanning directory {currentDir}");
                    string tempPathDirectory = Pathy.Combine(targetDir, currentDir);
                    Directory.CreateDirectory(tempPathDirectory);
                    string[] subDirs = cd.GetDirectories(currentDir);
                    try
                    {
                        string[] files = cd.GetFiles(currentDir);
                        foreach (string file in files)
                        {
                            string normalizedFileName = file.Remove(file.Length - 2);
                            string onIsoPath          = Pathy.Combine(currentDir, file);
                            string newPath            = Pathy.Combine(targetDir, normalizedFileName);
                            Debug.WriteLine($"Copying from {onIsoPath} to {newPath}");
                            using (var fileStream = File.Create(newPath))
                            {
                                using (var gameFileStream = cd.OpenFile(file, FileMode.Open))
                                {
                                    gameFileStream.CopyTo(fileStream);
                                }
                            }
                        }
                    }
                    catch (Exception err)
                    {
                        Debug.WriteLine(err);
                        Debug.WriteLine($"Error ({err.Message}) in {currentDir}");
                        throw;
                    }

                    foreach (string str in subDirs)
                    {
                        dirs.Push(str);
                    }
                }
            }
        }
Example #2
0
        private void Merge_Mod(object sender, RoutedEventArgs e)
        {
            if (GogFilePath.Text == null || GogFilePath.Text == "")
            {
                MessageBox.Show("GOG file path is empty!");
                return;
            }
            if (ModFilePath.Text == null || ModFilePath.Text == "")
            {
                MessageBox.Show("Mod file path is empty!");
                return;
            }
            this.IsEnabled = false;

            string windowsTempDirectory = System.IO.Path.GetTempPath();
            string uniqueDirectoryName  = System.IO.Path.GetRandomFileName();
            string tempDirectory        = Pathy.Combine(windowsTempDirectory, uniqueDirectoryName);

            Debug.WriteLine($"windowsTempDirectory={windowsTempDirectory}");
            Debug.WriteLine($"uniqueDirectoryName={uniqueDirectoryName}");
            Debug.WriteLine($"tempDirectory={tempDirectory}");

            Directory.CreateDirectory(tempDirectory);
            IsoExtractor.ExtractIso(GogFilePath.Text, tempDirectory);
            string backupName = $"{GogFilePath.Text}.{DateTime.Now.ToString("dd.MM.yyyy.hh.mm")}.backup";

            if (BackupState.IsChecked == true)
            {
                File.Copy(GogFilePath.Text, backupName);
            }

            using (FileStream zipToOpen = new FileStream(ModFilePath.Text, FileMode.Open))
            {
                using (ZipArchive archive = new ZipArchive(zipToOpen, ZipArchiveMode.Read))
                {
                    ZipArchiveExtensions.ExtractToDirectory(archive, tempDirectory);
                }
            }


            IsoFromDirectory.Create(tempDirectory, GogFilePath.Text);
            MessageBox.Show("Patching complete!");
            this.Close();
        }