private void btnPerformRestore_Click(object sender, EventArgs e)
        {
            BackupFileItem bfi = (BackupFileItem)cbRestoreFile.SelectedItem;

            if (bfi == null)
            {
                tsStatus.ForeColor = Color.Black;
                tsStatus.Text      = "Please select a file to restore.";
                return;
            }

            //Disable auto-snapshot while performing restore
            saveWatcher.EnableRaisingEvents = false;

            using (ZipArchive archive = ZipFile.OpenRead(bfi.FilePath))
            {
                foreach (ZipArchiveEntry entry in archive.Entries)
                {
                    try
                    {
                        entry.ExtractToFile(Path.Combine(SavePath, entry.Name), true);
                    }
                    catch (System.UnauthorizedAccessException uae)
                    {
                        if (entry.Name == "meshsave.txt")
                        {
                            continue;
                        }
                        else
                        {
                            string errorMessage = "Unable to restore save file " + bfi.DisplayName;
                            errorMessage += "\n\nError with file: " + entry.Name;
                            errorMessage += "\n\n\n" + uae.ToString();
                            MessageBox.Show(errorMessage, "Unable to restore", MessageBoxButtons.OK, MessageBoxIcon.Error);

                            tsStatus.ForeColor = Color.Red;
                            tsStatus.Text      = "Restore failed - " + bfi.DisplayName;
                            return;
                        }
                    }
                }
            }

            //Re-enable auto-snapshot if needed
            saveWatcher.EnableRaisingEvents = cbSnapshotEnabled.Checked;

            tsStatus.ForeColor = Color.Black;
            tsStatus.Text      = "Restored backup " + bfi.DisplayName;
        }
        private void updateView()
        {
            if (lblTimestamp.InvokeRequired)
            {
                var d = new SafeUpdateView(updateView);
                lblTimestamp.Invoke(d);
            }
            else
            {
                //Grab the current save file timestamp
                FileInfo fi = new FileInfo(Path.Combine(SavePath, "defaultES2File.txt"));

                if (fi.Exists)
                {
                    DateTime saveFileTime = fi.LastWriteTime;
                    lblTimestamp.Text = "Save Timestamp: " + saveFileTime.ToString("g");

                    btnPerformBackup.Enabled = true;
                }
                else
                {
                    lblTimestamp.Text        = "!! No MSC save found !!";
                    btnPerformBackup.Enabled = false;
                }

                //Search for backup files
                string[] listFiles = Directory.GetFiles(BackupFolder, "*.zip");

                tsStatus.Text = listFiles.Length.ToString() + " backup(s) found";

                //Skip reloading the backup file list if it hasn't changed
                if (listFiles.Length != backupFiles.Length)
                {
                    backupFiles = new BackupFileItem[listFiles.Length];

                    for (int i = 0; i < listFiles.Length; i++)
                    {
                        backupFiles[i] = new BackupFileItem();

                        backupFiles[i].FilePath = listFiles[i];

                        string fileName = Path.GetFileName(listFiles[i]);
                        string fileDate = fileName.Substring(16, 19);
                        string comment  = "";

                        if (fileName[35] == '_')
                        {
                            comment = " - " + fileName.Substring(36).Split('.')[0];
                        }

                        string fileTime = fileDate.Split('T')[1];
                        fileTime = fileTime.Replace('-', ':');
                        fileDate = fileDate.Split('T')[0] + "T" + fileTime;
                        string displayName = DateTime.Parse(fileDate).ToString("g") + comment;
                        backupFiles[i].DisplayName = displayName;
                    }

                    cbRestoreFile.Items.Clear();
                    cbRestoreFile.Items.AddRange(backupFiles);
                }

                btnPerformRestore.Enabled = !(listFiles.Length == 0);
            }
        }