Not fully tested so this may or may not meet your requirements. Play with properties SourceFolder
and TargetFolder
. The Helper class belongs in it's on file. The code is based off a need to traverse folders lower to upper for a tool I created.
One button
using System;
using System.Collections.Generic;
using System.IO;
using System.Windows.Forms;
namespace DirectoryCode
{
public partial class Form1 : Form
{
public Form1()
{
InitializeComponent();
}
private string SourceFolder => @"D:\OED\Dotnetland";
private string TargetFolder => @"C:\OED\Dotnetland";
private void CompareButton_Click(object sender, EventArgs e)
{
if (string.Equals(SourceFolder, TargetFolder, StringComparison.OrdinalIgnoreCase))
{
MessageBox.Show(@"Pick another path");
return;
}
Helpers.TraverseFolder += DirectoryExtensionsOnTraverse;
Helpers.Traverse(TargetFolder);
Helpers.TraverseFolder -= DirectoryExtensionsOnTraverse;
}
private void DirectoryExtensionsOnTraverse(string sender)
{
if (sender == SourceFolder)
{
MessageBox.Show(@"Pick another path");
Helpers.Continue = false;
}else if (sender == Helpers.DoneMessage && Helpers.Continue)
{
MessageBox.Show(@"Good to go");
}
}
}
public static class Helpers
{
public delegate void OnTraverse(string sender);
public static event OnTraverse TraverseFolder;
public static bool Continue { get; set; }
public static string DoneMessage => "Done";
/// <summary>
/// Traverse folders default to 20 levels deep
/// </summary>
/// <param name="folderName"></param>
/// <param name="level"></param>
/// <returns></returns>
public static string LoopFolder(this string folderName, int level = 20)
{
Continue = true;
var folderList = new List<string>();
while (!string.IsNullOrWhiteSpace(folderName))
{
if (Continue == false)
{
break;
}
var parentFolder = Directory.GetParent(folderName);
if (parentFolder == null)
{
break;
}
folderName = Directory.GetParent(folderName)?.FullName;
folderList.Add(folderName);
TraverseFolder?.Invoke(folderName);
}
if (folderList.Count > 0 && level > 0)
{
if (level - 1 <= folderList.Count - 1)
{
return folderList[level - 1];
}
else
{
TraverseFolder?.Invoke(DoneMessage);
return folderName;
}
}
else
{
return folderName;
}
}
public static void Traverse(string folder)
{
folder.LoopFolder();
}
}
}