public string Pak2Folder()
        {
            if (!File.Exists(zipPath))
            {
                return("Specified file doesn't exist!");
            }

            if (!Directory.Exists(dir))
            {
                return("Specified directory doesn't exist!");
            }

            string folderName = Path.GetFileNameWithoutExtension(zipPath);

            dir += "\\" + folderName;
            if (Directory.Exists(dir))
            {
                return("The folder you tried extracting the files to already contains a folder with the name \"" + folderName + ".\" Please rename that folder or choose another directory.");
            }

            Program.WriteDebugText("Extracting .pak file...");
            Directory.CreateDirectory(dir);
            ZipFile.ExtractToDirectory(zipPath, dir);

            string[] foils = Directory.GetFiles(dir, "*" + Constants.DAT_EXT, SearchOption.AllDirectories);
            Program.WriteDebugText("\nExtraction complete.");
            Program.WriteDebugText("Converting .dat files...");

            for (int i = 0; i < foils.Length; i++)
            {
                string fileNoExt = Path.ChangeExtension(foils[i], null);

                string inFilePath  = foils[i].Substring(dir.Length + 1);
                string outFilePath = "NaN";
                try
                {
                    using (XORParser parser = new XORParser(foils[i], fileNoExt, false))
                    {
                        parser.CryptFiles();
                        outFilePath = parser.OutFileName.Substring(dir.Length + 1);
                    }

                    File.Delete(foils[i]);
                    Program.WriteDebugText("  Parsed file: " + inFilePath + " -> " + outFilePath, parsedFileColor);
                }
                catch (Exception e)
                {
                    Program.WriteDebugText("  Error occured with file " + Path.GetFileName(foils[i]) + "!", Color.Red);
                    Program.WriteDebugText("  " + e.Message + " -> " + e.StackTrace, Color.Red);
                }

                Program.MainForm.StepProgress((i + 1) * 100 / foils.Length);
            }

            Program.WriteDebugText("\n" + Path.GetFileName(zipPath) + " extracted successfully!", Color.Green);
            return(null);
        }
        public string Folder2Pak()
        {
            if (!Directory.Exists(dir))
            {
                return("Specified directory doesn't exist!");
            }

            Program.WriteDebugText("Encrypting files...");
            string[] files   = Directory.EnumerateFiles(dir, "*.*", SearchOption.AllDirectories).ToArray();
            string   tempDir = GetTemporaryDirectory();

            for (int i = 0; i < files.Length; i++)
            {
                string relativeInputFilePath  = files[i].Substring(dir.Length + 1);
                string relativeOutputFilePath = files[i].Substring(dir.Length + 1);

                // Make the appropriate directories in the folder to be compressed.
                if (!Directory.Exists(tempDir + relativeOutputFilePath))
                {
                    Directory.CreateDirectory(tempDir + Path.GetDirectoryName(relativeOutputFilePath));
                }

                // If the file was encrypted, re-encrypt it.
                bool success = true;
                if (relativeOutputFilePath.EndsWith(Constants.IMG_EXT) || relativeOutputFilePath.EndsWith(Constants.GENERIC_EXT))
                {
                    relativeOutputFilePath = Path.ChangeExtension(relativeOutputFilePath, Constants.DAT_EXT);
                    try
                    {
                        using (XORParser parser = new XORParser(files[i], tempDir + relativeOutputFilePath, true))
                        {
                            parser.CryptFiles();
                        }
                    }
                    catch (Exception e)
                    {
                        success = false;
                        Program.WriteDebugText("  Error occured with file " + relativeInputFilePath + "!", Color.Red);
                        Program.WriteDebugText(e.Message + " -> " + e.StackTrace, Color.Red);
                    }
                }
                else // Otherwise just copy the file over.
                {
                    File.Copy(files[i], tempDir + relativeOutputFilePath);
                }

                if (success)
                {
                    Program.WriteDebugText("  Parsed file: " + relativeInputFilePath + " -> " + relativeOutputFilePath, parsedFileColor);
                }
                Program.MainForm.StepProgress((i + 1) * 100 / files.Length);
            }

            Program.WriteDebugText("\nEncryption complete.");
            Program.WriteDebugText("Creating .pak file...");

            // User is prompted about overwriting prior to reaching this point.
            if (File.Exists(zipPath))
            {
                File.Delete(zipPath);
            }
            ZipFile.CreateFromDirectory(tempDir, zipPath);

            Program.WriteDebugText("Cleaning up...");
            Directory.Delete(tempDir, true);

            Program.WriteDebugText("\n" + Path.GetFileName(zipPath) + " created successfully!", Color.Green);

            return(null);
        }