private VssSnapshotProperties GetVssSnapshotFromTime(DateTime selectedCreationTime) { Debug.WriteLine(string.Format("Selected creation time: {0}", selectedCreationTime.ToLongTimeString())); // Get selected restore point SystemRestoreItem selectedSystemRestoreItem = null; foreach (SystemRestoreItem sri in systemRestorePoints) { if (sri.CreationTime.ToLocalTime().CompareTo(selectedCreationTime) == 0) { selectedSystemRestoreItem = sri; break; } } // Enumerate snapshots using VSS API IVssImplementation vssImplmentation = VssUtils.LoadImplementation(); ////VssBackupComponents vss = new VssBackupComponents(); IVssBackupComponents vssBackup = vssImplmentation.CreateVssBackupComponents(); vssBackup.InitializeForBackup(null); vssBackup.SetContext(VssSnapshotContext.All); List <VssSnapshotProperties> snapshotHourMatches = new List <VssSnapshotProperties>(); List <VssSnapshotProperties> snapshotMinuteMatches = new List <VssSnapshotProperties>(); foreach (VssSnapshotProperties snapshot in vssBackup.QuerySnapshots()) { DateTime truncatedSelectedRestoreItemTime = TruncateToHour(selectedSystemRestoreItem.CreationTime.ToLocalTime()); DateTime truncatedSnapshotTime = TruncateToHour(snapshot.CreationTimestamp); if (truncatedSelectedRestoreItemTime.CompareTo(truncatedSnapshotTime) == 0) { snapshotHourMatches.Add(snapshot); } } if (snapshotHourMatches.Count == 1) { Debug.WriteLine(string.Format("Snapshot creation time: {0}", snapshotHourMatches[0].CreationTimestamp.ToLongTimeString())); return(snapshotHourMatches[0]); } else if (snapshotHourMatches.Count > 1) { foreach (VssSnapshotProperties snapshot in snapshotHourMatches) { DateTime truncatedSelectedRestoreItemTime = TruncateToMinute(selectedSystemRestoreItem.CreationTime.ToLocalTime()); DateTime truncatedSnapshotTime = TruncateToMinute(snapshot.CreationTimestamp); if (truncatedSelectedRestoreItemTime.CompareTo(truncatedSnapshotTime) == 0) { snapshotMinuteMatches.Add(snapshot); } } if (snapshotMinuteMatches.Count == 1) { Debug.WriteLine(string.Format("Snapshot creation time: {0}", snapshotMinuteMatches[0].CreationTimestamp.ToLongTimeString())); return(snapshotMinuteMatches[0]); } else if (snapshotMinuteMatches.Count > 1) { Debug.WriteLine(string.Format("Found {0} potential matches", snapshotMinuteMatches.Count.ToString())); // Find closest match foreach (VssSnapshotProperties snapshot in snapshotMinuteMatches) { if (selectedSystemRestoreItem.CreationTime.ToLocalTime().CompareTo(snapshot.CreationTimestamp) < 0) { Debug.WriteLine(string.Format("Snapshot creation time: {0}", snapshot.CreationTimestamp.ToLongTimeString())); return(snapshot); } } } } return(null); }
private void btnDelete_Click(object sender, EventArgs e) { // Get selected restore point SystemRestoreItem selectedSystemRestoreItem = null; string time = lvRestorePoints.Items[lvRestorePoints.SelectedIndices[0]].Text; DateTime selectedCreationTime = DateTime.Parse(time); foreach (SystemRestoreItem sri in systemRestorePoints) { if (sri.CreationTime.ToLocalTime().CompareTo(selectedCreationTime) == 0) { selectedSystemRestoreItem = sri; break; } } if (selectedSystemRestoreItem.SequenceNumber > 0) { // Need to display are you sure dialog! string prompt = "Are you sure you want to remove system restore point?"; TaskDialogResult tdr = TaskDialog.Show(this, selectedSystemRestoreItem.CreationTime.ToString() + "\n" + selectedSystemRestoreItem.Description, prompt, this.Text, TaskDialogButtons.Yes | TaskDialogButtons.No, TaskDialogIcon.Warning); // If the user is sure if (tdr == TaskDialogResult.Yes) { // Remove the restore point uint result = VolumeNativeMethods.SRRemoveRestorePoint(selectedSystemRestoreItem.SequenceNumber); // If success if (result == 0) { // Update internal data on system restore points and shadow storage systemRestorePoints = new SystemRestorePoints(); shadowStorage = new ShadowStorage(); lblDiskSpace.Text = shadowStorage.UsedSpaceString; UpdateListView(sender, e); // Only show chkOlder if there are older restore points int olderCount = 0; foreach (SystemRestoreItem sri in systemRestorePoints) { if (sri.CreationTime.ToLocalTime().CompareTo(DateTime.Now.Subtract(TimeSpan.FromDays(5))) < 0) { olderCount++; } } if (olderCount > 0) { chkHideNewest.Visible = true; } else { chkHideNewest.Visible = false; } } else { MessageBox.Show("Error deleting restore point"); } } } }