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); } } } }
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(); }