Script Backup Tool V1.1
using System;
using System.IO;
using System.Linq;
using System.Collections.Generic;
namespace ScriptsBackup
{
class Program
{
static void Main(string[] args)
{
Console.WriteLine("Welcome to the C# ScriptsBackup Tool");
Console.WriteLine("-------------------------------------");
string defaultSourceDriveLetter = "D";
string defaultDestinationDriveLetter = "F";
Console.Write($"Enter the source drive letter (default: '{defaultSourceDriveLetter}'): ");
string sourceDriveLetter = Console.ReadLine();
if (string.IsNullOrWhiteSpace(sourceDriveLetter))
{
sourceDriveLetter = defaultSourceDriveLetter;
}
string sourceDirectory = $@"{sourceDriveLetter}:\";
Console.Write($"Enter the destination drive letter (default: '{defaultDestinationDriveLetter}'): ");
string destinationDriveLetter = Console.ReadLine();
if (string.IsNullOrWhiteSpace(destinationDriveLetter))
{
destinationDriveLetter = defaultDestinationDriveLetter;
}
string destinationDirectory = $@"{destinationDriveLetter}:\ScriptsBackup_{DateTime.Now.ToString("yyyyMMdd_HHmmss")}";
long requiredFreeSpace = 1L * 1024 * 1024 * 1024; // 1GB
long availableFreeSpace = GetAvailableFreeSpace(destinationDriveLetter);
if (availableFreeSpace < requiredFreeSpace)
{
Console.WriteLine($"Not enough free space on the target drive. You need at least 1GB of free space.");
return;
}
Console.WriteLine($"Source: {sourceDirectory}");
Console.WriteLine($"Destination: {destinationDirectory}");
Console.Write("Do you want to continue? (Y/N): ");
string userInput = Console.ReadLine();
if (userInput.Equals("N", StringComparison.OrdinalIgnoreCase))
{
Console.WriteLine("Operation cancelled by the user.");
return;
}
if (!Directory.Exists(destinationDirectory))
{
Directory.CreateDirectory(destinationDirectory);
}
Console.WriteLine("Scanning your drive for files to backup...");
ScanAndCopyScripts(sourceDirectory, destinationDirectory);
}
private static void LogError(string destinationDirectory, string message)
{
string logFilePath = Path.Combine(destinationDirectory, "ScriptsBackupError.log");
using (StreamWriter writer = new StreamWriter(logFilePath, true))
{
writer.WriteLine($"{DateTime.Now}: {message}");
}
}
private static long GetAvailableFreeSpace(string driveLetter)
{
DriveInfo driveInfo = new DriveInfo(driveLetter);
return driveInfo.AvailableFreeSpace;
}
private static string[] GetCSharpFiles(string directory)
{
var cSharpFiles = new List<string>();
var subdirectoriesToProcess = new Stack<string>();
subdirectoriesToProcess.Push(directory);
while (subdirectoriesToProcess.Count > 0)
{
string currentDirectory = subdirectoriesToProcess.Pop();
try
{
cSharpFiles.AddRange(Directory.GetFiles(currentDirectory, "*.cs"));
foreach (string subdirectory in Directory.GetDirectories(currentDirectory))
{
subdirectoriesToProcess.Push(subdirectory);
}
}
catch (UnauthorizedAccessException)
{
Console.WriteLine($"Access denied: Unable to scan {currentDirectory}. Skipping.");
}
}
return cSharpFiles.ToArray();
}
private static void ScanAndCopyScripts(string sourceDirectory, string destinationDirectory)
{
string[] cSharpFiles = GetCSharpFiles(sourceDirectory);
string excludedFolder1 = Path.Combine(sourceDirectory, "MyProjects");
string excludedFolder2 = Path.Combine(sourceDirectory, "TEST");
string excludedFolder3 = Path.Combine(sourceDirectory, "GAMES");
string excludedFolder4 = Path.Combine(sourceDirectory, "$RECYCLE.BIN");
string excludedFolder5 = Path.Combine(sourceDirectory, "Library");
// Filter out files within the excluded folders
cSharpFiles = cSharpFiles.Where(file => !file.StartsWith(excludedFolder1, StringComparison.OrdinalIgnoreCase) &&
!file.StartsWith(excludedFolder2, StringComparison.OrdinalIgnoreCase) &&
!file.StartsWith(excludedFolder3, StringComparison.OrdinalIgnoreCase) &&
!file.StartsWith(excludedFolder4, StringComparison.OrdinalIgnoreCase) &&
!file.StartsWith(excludedFolder5, StringComparison.OrdinalIgnoreCase)).ToArray();
Console.WriteLine("C# scripts found: " + cSharpFiles.Length);
bool overwriteAll = false;
bool askEachTime = true;
int totalFiles = cSharpFiles.Length;
int filesProcessed = 0;
foreach (string filePath in cSharpFiles)
{
string destinationPath = Path.Combine(destinationDirectory, Path.GetRelativePath(sourceDirectory, filePath));
string directoryPath = Path.GetDirectoryName(destinationPath);
if (!Directory.Exists(directoryPath))
{
Directory.CreateDirectory(directoryPath);
}
if (File.Exists(destinationPath))
{
if (askEachTime)
{
Console.Write($"File {destinationPath} already exists. Do you want to overwrite? (Y/N/All): ");
string input = Console.ReadLine();
if (input.Equals("All", StringComparison.OrdinalIgnoreCase))
{
overwriteAll = true;
askEachTime = false;
}
else if (!input.Equals("Y", StringComparison.OrdinalIgnoreCase))
{
filesProcessed++;
DisplayProgress(filesProcessed, totalFiles);
continue;
}
}
}
try
{
if (overwriteAll || !File.Exists(destinationPath))
{
File.Copy(filePath, destinationPath, true);
Console.WriteLine($"Copied: {filePath} -> {destinationPath}");
}
}
catch (UnauthorizedAccessException)
{
Console.WriteLine($"Access denied: Unable to copy {filePath}. Skipping.");
}
filesProcessed++;
DisplayProgress(filesProcessed, totalFiles);
}
Console.WriteLine("Backup completed.");
}
private static void DisplayProgress(int filesProcessed, int totalFiles)
{
double percentage = ((double)filesProcessed / totalFiles) * 100;
Console.WriteLine($"Progress: {filesProcessed}/{totalFiles} ({percentage:0.00}%)");
}
}
}
Comments
Post a Comment