Exemplo n.º 1
0
        /// <summary>
        ///     Manages the paks.
        /// </summary>
        private void ManagePaks(StringBuilder logBuilder)
        {
            logBuilder.AppendLine(Logger.BuildLogWithDate("Starting to manage Paks"));

            FindPaks(logBuilder);

            logBuilder.AppendLine(Logger.BuildLogWithDate("Searching for actual files in Paks"));

            var zippedFiles = new List <ModFile>();

            foreach (var file in Files)
            {
                var parts    = file.FileName.Split('\\');
                var filename = parts[parts.Length - 3] + "\\" + parts[parts.Length - 2] + "\\" +
                               parts[parts.Length - 1];

                var isRAR = CheckForRar(file.FileName, filename, logBuilder);

                // Replace RAR with ZIP
                if (isRAR)
                {
                    logBuilder.AppendLine(Logger.BuildLogWithDate("Replacing RAR with ZIP"));

                    Directory.CreateDirectory(file.FilePath + "\\TEMP_EXTRACT");
                    using (var rar = new Unrar(file.FileName))
                    {
                        rar.Open(Unrar.OpenMode.Extract);
                        rar.ReadHeader();
                        while (rar.CurrentFile != null)
                        {
                            rar.ExtractToDirectory(file.FilePath + "\\TEMP_EXTRACT");
                            rar.ReadHeader();
                        }

                        rar.Close();
                    }

                    logBuilder.AppendLine(Logger.BuildLogWithDate("Extracted RAR!"));

                    ZipFile.CreateFromDirectory(file.FilePath + "\\TEMP_EXTRACT", file.FileName + ".extracted");

                    Directory.Delete(file.FilePath + "\\TEMP_EXTRACT", true);

                    logBuilder.AppendLine(Logger.BuildLogWithDate("Created ZIP!"));

                    if (File.Exists(file.FileName + ".extracted") &&
                        new FileInfo(file.FileName + ".extracted").Length > 30)
                    {
                        logBuilder.AppendLine(Logger.BuildLogWithDate("ZIP seems valid! Replacing RAR"));
                        File.Move(file.FileName, file.FileName + ".backup");
                        File.Move(file.FileName + ".extracted", file.FileName);
                        logBuilder.AppendLine(Logger.BuildLogWithDate("Replaced RAR!"));
                    }
                    else
                    {
                        logBuilder.AppendLine(Logger.BuildLogWithDate("ZIP does not contain any data!"));
                        logBuilder.AppendLine(Logger.BuildLogWithDate("Critical Error: This should not be the case. Check the file format and perhaps manually convert it to ZIP!"));
                        MessageBox.Show(
                            "Critical Error: ZIP does not contain any data! Check the file format and perhaps manually convert it to ZIP!",
                            "KCDModMerger", MessageBoxButton.OK);
                    }
                }

                zippedFiles.AddRange(FindFilesInZIP(file, filename, logBuilder));
            }

            logBuilder.AppendLine(Logger.BuildLogWithDate("Found total of " + zippedFiles.Count, true));

            DataFiles = zippedFiles.ToArray();
        }