Files
AllPurposeAutoSetup/AllPurposeAutoSetup/FileFolderRemovalManager.cs
2025-03-13 18:24:10 -07:00

351 lines
14 KiB
C#

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;
using System.Threading;
using System.Diagnostics;
using System.Text.RegularExpressions;
using System.IO;
using System.Security.AccessControl;
using System.Management;
using System.Security.Principal;
using System.Runtime.InteropServices;
using Microsoft.Win32;
using System.Drawing;
using System.Xml;
using System.Xml.XPath;
using System.Net;
using CommonLib.Windows.Forms;
using CommonLib.IO;
using CommonLib.Misc;
namespace All_Purpose_Auto_Setup
{
class FileFolderRemovalManager
{
// An event that can be raised, allowing other classes to
// subscribe to it and do what they like with the message.
public event Action<string, string, List<CommonLib.Windows.Forms.TextFormat.TextFontAndColor>> UpdateStatusDisplayAndLogEvent;
public event Action<string, int, List<CommonLib.Windows.Forms.TextFormat.TextFontAndColor>> UpdateStatusDisplayAtLine;
public List<ConfigFileManager.Ini_KeyValue<bool>> filesFoldersToBeRemoved = new List<ConfigFileManager.Ini_KeyValue<bool>>();
Form m_parentForm;
public FileFolderRemovalManager(Form parentForm)
{
m_parentForm = parentForm;
}
public bool removeFilesFolders(string sectionName)
{
bool setupSuccessful = true;
string msg, indentation = String.Empty, displayMsg = "", logMsg = "";
CommonLib.Windows.Forms.TextFormat.TextFontAndColor defaultTextProp = new CommonLib.Windows.Forms.TextFormat.TextFontAndColor("");
CommonLib.Windows.Forms.TextFormat.TextFontAndColor textProp = new CommonLib.Windows.Forms.TextFormat.TextFontAndColor("");
List<CommonLib.Windows.Forms.TextFormat.TextFontAndColor> textPropList = new List<CommonLib.Windows.Forms.TextFormat.TextFontAndColor>();
// set font to default text and color
textProp.textFont = defaultTextProp.textFont;
textProp.textColor = Common.getSetupStepTitleColor();
textProp.wordIndex = 0;
textProp.wordCount = 100;
textPropList.Add(textProp);
DateTime dat1 = DateTime.Now;
msg = "\n\n<-------------------Date and Time: " + dat1.ToString(@"MM/dd/yyyy hh:mm:ss tt", System.Globalization.CultureInfo.InvariantCulture) + "------------------->";
UpdateStatusDisplayAndLogEvent(msg, msg, textPropList);
// set font to default text and color
textProp.textFont = defaultTextProp.textFont;
textProp.textColor = Common.getSetupStepTitleColor();
textProp.wordIndex = 0;
textProp.wordCount = 10;
// set font size
textProp.textFont = new Font(textProp.textFont.Name, 12);
// set font style
textProp.textFont = new Font(textProp.textFont, FontStyle.Bold);
textPropList.Add(textProp);
msg = "\n-=Removing Files/Folders=-";
UpdateStatusDisplayAndLogEvent(msg, msg, textPropList);
filesFoldersToBeRemoved.Clear();
parseConfigInfo(sectionName);
if (setupSuccessful)
{
int filesDeletedCount = 0, foldersDeletedCount = 0, filesSkipped = 0, foldersSkipped = 0;
frmSetupStatusDisplay displayFrm = (frmSetupStatusDisplay)m_parentForm;
int itemCountLineIndex = displayFrm.updateStatusDisplayAndLog("\n ", "", textPropList);
int deleteItemLineIndex = displayFrm.updateStatusDisplayAndLog("\n ", "", textPropList);
List<string> filesAndFoldersToBeRemoved = new List<string>();
foreach (ConfigFileManager.Ini_KeyValue<bool> item in filesFoldersToBeRemoved)
{
string path = "";
path = Path.GetFullPath(Common.resolveMacroPath(item.iniValue));
if (File.Exists(path))
{
filesAndFoldersToBeRemoved.Add(path);
}
else if (Directory.Exists(path))
{
// delete folder recursively
if (item.alternateValue)
{
filesAndFoldersToBeRemoved.Add(path);
}
else
{
string[] files = Directory.GetFiles(path, "*.*", SearchOption.TopDirectoryOnly);
filesAndFoldersToBeRemoved.AddRange(files.ToList());
}
}
else
{
string what = "";
if (PathManip.PathIsFile(path))
{
filesSkipped++;
what = "File";
}
else
{
foldersSkipped++;
what = "Folder";
}
indentation = Common.getIndentation(1);
logMsg = "\n" + indentation + "Deleting " + path + " - SKIPPED. " + what + " does not exist";
UpdateStatusDisplayAndLogEvent("", logMsg, textPropList);
}
}
foreach (string item in filesAndFoldersToBeRemoved)
{
indentation = Common.getIndentation(1);
msg = indentation + "Files Deleted: " + filesDeletedCount.ToString() + " Folders Deleted: " + foldersDeletedCount.ToString();
// set font to default text and color
textProp.textFont = defaultTextProp.textFont;
textProp.textColor = Color.FromArgb(5, 112, 1);
textProp.wordIndex = 0;
textProp.wordCount = 2;
// set font style
textPropList.Add(textProp);
// set font to default text and color
textProp.textFont = defaultTextProp.textFont;
textProp.textColor = Color.FromArgb(5, 112, 1);
textProp.wordIndex = 2;
textProp.wordCount = 1;
// set font style
textProp.textFont = new Font(textProp.textFont.FontFamily, 10, FontStyle.Bold);
textPropList.Add(textProp);
// set font to default text and color
textProp.textFont = defaultTextProp.textFont;
textProp.textColor = Color.FromArgb(5, 112, 1);
textProp.wordIndex = StringManip.GetPhraseWordIndexInText(msg, "Folders deleted:");
textProp.wordCount = 2;
textPropList.Add(textProp);
// set font to default text and color
textProp.textFont = defaultTextProp.textFont;
textProp.textColor = Color.FromArgb(5, 112, 1);
textProp.wordIndex = StringManip.GetPhraseWordIndexInText(msg, "Folders deleted:") + 2;
textProp.wordCount = 1;
// set font style
textProp.textFont = new Font(textProp.textFont.FontFamily, 10, FontStyle.Bold);
textPropList.Add(textProp);
UpdateStatusDisplayAtLine(msg, itemCountLineIndex, textPropList);
//tempTextPropList = new List<CommonLib.Windows.Forms.TextFormat.TextFontAndColor>(textPropList);
if (File.Exists(item) || Directory.Exists(item))
{
displayMsg = indentation + "Deleting " + StringManip.ShortenStringToSize(item, 65);
// set font to default text and color
textProp.textFont = defaultTextProp.textFont;
//textProp.textColor = Color.FromArgb(157, 150, 19);
textProp.wordIndex = 0;
textProp.wordCount = 1;
textPropList.Add(textProp);
// set font to default text and color
textProp.textFont = defaultTextProp.textFont;
textProp.textColor = Color.FromArgb(255, 60, 0);
textProp.wordIndex = 1;
textProp.wordCount = 100;
// set font style
textProp.textFont = new Font(textProp.textFont, FontStyle.Bold);
textPropList.Add(textProp);
UpdateStatusDisplayAtLine(displayMsg, deleteItemLineIndex, textPropList);
if (Directory.Exists(item))
{
try
{
PathManip.DeleteFoldersRecursive(item);
foldersDeletedCount++;
logMsg = "\n" + indentation + "Deleting " + item + " - SUCCESS";
}
catch (Exception e)
{
// set font to default text and color
textProp.textFont = defaultTextProp.textFont;
textProp.textColor = Common.getSetupStatusColor(Common.EXECUTION_STATUS.FAILURE);
textProp.wordIndex = 0;
textProp.wordCount = 2;
// set font style
textProp.textFont = new Font(textProp.textFont, FontStyle.Bold);
textPropList.Add(textProp);
displayMsg = "\n" + indentation + "- FAILED. Error deleting folder\n" + indentation + "Folder: " + item + "\n" + indentation + "Error description: " + e.Message;
logMsg = "\n" + indentation + "Deleting " + item + " - FAILED";
setupSuccessful = false;
}
}
else
{
try
{
File.SetAttributes(item, FileAttributes.Normal);
File.Delete(item);
filesDeletedCount++;
logMsg = "\n" + indentation + "Deleting " + item + " - SUCCESS";
}
catch (Exception e)
{
// set font to default text and color
textProp.textFont = defaultTextProp.textFont;
textProp.textColor = Common.getSetupStatusColor(Common.EXECUTION_STATUS.FAILURE);
textProp.wordIndex = 0;
textProp.wordCount = 2;
// set font style
textProp.textFont = new Font(textProp.textFont, FontStyle.Bold);
textPropList.Add(textProp);
displayMsg = "\n" + indentation + "- FAILED. Error deleting file\n" + indentation + "File: " + item + "\n" + indentation + "Error description: " + e.Message;
logMsg = "\n" + indentation + "Deleting " + item + " - FAILED";
setupSuccessful = false;
}
}
if (!setupSuccessful)
{
break;
}
UpdateStatusDisplayAndLogEvent("", logMsg, textPropList);
}
Thread.Sleep(2000);
}
// delete the very first line that is the start of the progress update
// all the lines below the first starting lines will get deleted too
for (int i = 1; i <= 2; i++)
{
displayFrm.removeStatusDisplayLine(itemCountLineIndex, true);
}
if (!setupSuccessful)
{
UpdateStatusDisplayAndLogEvent(displayMsg, logMsg, textPropList);
}
if (setupSuccessful)
{
if (filesFoldersToBeRemoved.Count == 0)
{
// set font to default text and color
textProp.textFont = defaultTextProp.textFont;
textProp.textColor = Common.getSetupStatusColor(Common.EXECUTION_STATUS.SYSTEM_SKIP);
textProp.wordIndex = 0;
textProp.wordCount = 2;
// set font style
textProp.textFont = new Font(textProp.textFont, FontStyle.Bold);
textPropList.Add(textProp);
indentation = Common.getIndentation(1);
msg = "\n" + indentation + "- SKIPPED. No file/folder to delete";
UpdateStatusDisplayAndLogEvent(msg, msg, textPropList);
}
else
{
// set font to default text and color
textProp.textFont = defaultTextProp.textFont;
textProp.textColor = Common.getSetupStatusColor(Common.EXECUTION_STATUS.SUCCESS);
textProp.wordIndex = 0;
textProp.wordCount = 2;
// set font style
textProp.textFont = new Font(textProp.textFont, FontStyle.Bold);
textPropList.Add(textProp);
indentation = Common.getIndentation(1);
msg = "\n" + indentation + "- SUCCESS. (Files Deleted: " + filesDeletedCount + " ) (Folders Deleted: " + foldersDeletedCount + " )" + " (Files skipped: " + filesSkipped + " )" + " (Folders skipped: " + foldersSkipped + " )";
UpdateStatusDisplayAndLogEvent(msg, "", textPropList);
}
}
msg = "\n" + Common.getIndentation(1) + "Files Deleted: " + filesDeletedCount + " | Folders Deleted: " + foldersDeletedCount + " | Files Skipped: " + filesSkipped + " | Folders Skipped: " + foldersSkipped;
UpdateStatusDisplayAndLogEvent("", msg, textPropList);
}
return setupSuccessful;
}
private void parseConfigInfo(string sectionName)
{
string[] keyDataPair;
Match regExMatch;
ConfigFileManager.Ini_KeyValue<bool> bIniVal = new ConfigFileManager.Ini_KeyValue<bool>(false);
string[] sectionData;
sectionData = ConfigFileManager.ms_configGeneralInfo.iniFile.ReadSectionData(sectionName);
foreach (string path in sectionData)
{
keyDataPair = path.Split('=');
if (keyDataPair.Length == 2)
{
bIniVal.iniSectionName = sectionName;
bIniVal.iniKeyName = keyDataPair[0];
bIniVal.iniValue = keyDataPair[1];
regExMatch = Regex.Match(bIniVal.iniValue, @"^([^,]+),.*recursive.*", RegexOptions.IgnoreCase);
if (regExMatch.Success)
{
bIniVal.alternateValue = true;
bIniVal.iniValue = regExMatch.Groups[1].Value;
}
else
bIniVal.alternateValue = false;
filesFoldersToBeRemoved.Add(bIniVal);
}
}
}
}
}