private async Task ExtractFile(string file, string game) { await Task.Run(() => { if (Path.GetExtension(file).ToLower() == ".7z" || Path.GetExtension(file).ToLower() == ".rar" || Path.GetExtension(file).ToLower() == ".zip") { Directory.CreateDirectory($@"{assemblyLocation}\temp"); ProcessStartInfo startInfo = new ProcessStartInfo(); startInfo.CreateNoWindow = true; startInfo.FileName = $@"{Path.GetDirectoryName(Assembly.GetEntryAssembly().Location)}\Dependencies\7z\7z.exe"; if (!FileIOWrapper.Exists(startInfo.FileName)) { MessageBox.Show($"[ERROR] Couldn't find {startInfo.FileName}. Please check if it was blocked by your anti-virus.", "Error", MessageBoxButton.OK, MessageBoxImage.Warning); return; } startInfo.WindowStyle = ProcessWindowStyle.Hidden; startInfo.UseShellExecute = false; startInfo.Arguments = $@"x -y ""{file}"" -o""{assemblyLocation}\temp"""; using (Process process = new Process()) { process.StartInfo = startInfo; process.Start(); process.WaitForExit(); } setAttributesNormal(new DirectoryInfo($@"{assemblyLocation}\temp")); foreach (var folder in Directory.GetDirectories($@"{assemblyLocation}\temp", "*", SearchOption.AllDirectories).Where(x => File.Exists($@"{x}\Package.xml") || File.Exists($@"{x}\Mod.xml"))) { string path = $@"{assemblyLocation}\Packages\{game}\{Path.GetFileName(folder)}"; int index = 2; while (Directory.Exists(path)) { path = $@"{assemblyLocation}\Packages\{game}\{Path.GetFileName(folder)} ({index})"; index += 1; } MoveDirectory(folder, path); } var packgeSetup = Directory.GetFiles($@"{assemblyLocation}\temp", "*Packages.xml", SearchOption.AllDirectories); if (packgeSetup.Length > 0) { Directory.CreateDirectory($@"{assemblyLocation}\Config\temp"); foreach (var xml in packgeSetup) { File.Copy(xml, $@"{assemblyLocation}\Config\temp\{Path.GetFileName(xml)}", true); } } FileIOWrapper.Delete(file); } else { MessageBox.Show($"{file} isn't a .zip, .7z, or .rar, couldn't extract...", "Error", MessageBoxButton.OK, MessageBoxImage.Warning); } if (Directory.Exists($@"{assemblyLocation}\temp")) { Directory.Delete($@"{assemblyLocation}\temp", true); } }); }
private void MoveDirectory(string source, string target) { var sourcePath = source.TrimEnd('\\', ' '); var targetPath = target.TrimEnd('\\', ' '); var files = Directory.GetFiles(sourcePath, "*", SearchOption.AllDirectories) .GroupBy(s => Path.GetDirectoryName(s)); foreach (var folder in files) { var targetFolder = folder.Key.Replace(sourcePath, targetPath); Directory.CreateDirectory(targetFolder); foreach (var file in folder) { var targetFile = Path.Combine(targetFolder, Path.GetFileName(file)); if (FileIOWrapper.Exists(targetFile)) { FileIOWrapper.Delete(targetFile); } FileIOWrapper.Move(file, targetFile); } } Directory.Delete(source, true); }