Einige Erweiterungsmethoden, die ich für ein aktuelles Projekt geschrieben habe, umfassen eine, die dies tun wird:
public static bool IsSame(this DirectoryInfo that, DirectoryInfo other)
{
// Zip-Erweiterung würde hier nicht funktionieren, da es das längere Enumerable abschneidet, was zu einem falsch positiven Ergebnis führt
var e1 = that.EnumeratePathDirectories().GetEnumerator();
var e2 = other.EnumeratePathDirectories().GetEnumerator();
while (true)
{
var m1 = e1.MoveNext();
var m2 = e2.MoveNext();
if (m1 != m2) return false; // nicht die gleiche Länge
if (!m1) return true; // Enumeration beendet, ohne Unterschiede gefunden zu haben
if (!e1.Current.Name.Trim().Equals(e2.Current.Name.Trim(), StringComparison.InvariantCultureIgnoreCase))
return false; // der aktuelle Ordner in den Pfaden unterscheidet sich
}
}
public static IEnumerable EnumeratePathDirectories(this DirectoryInfo di)
{
var stack = new Stack();
DirectoryInfo current = di;
while (current != null)
{
stack.Push(current);
current = current.Parent;
}
return stack;
}
// für diese Frage irrelevant, aber dennoch nützlich:
public static bool IsSame(this FileInfo that, FileInfo other)
{
return that.Name.Trim().Equals(other.Name.Trim(), StringComparison.InvariantCultureIgnoreCase) &&
that.Directory.IsSame(other.Directory);
}
public static IEnumerable EnumeratePathDirectories(this FileInfo fi)
{
return fi.Directory.EnumeratePathDirectories();
}
public static bool StartsWith(this FileInfo fi, DirectoryInfo directory)
{
return fi.Directory.StartsWith(directory);
}
public static bool StartsWith(this DirectoryInfo di, DirectoryInfo directory)
{
return di.EnumeratePathDirectories().Any(d => d.IsSame(directory));
}