13 Stimmen

Wie überprüft man, ob 2 DirectoryInfo-Objekte auf das gleiche Verzeichnis zeigen?

Ich habe 2 DirectoryInfo-Objekte und möchte überprüfen, ob sie auf dasselbe Verzeichnis zeigen. Außer dem Vergleich ihrer Fullname, gibt es noch bessere Möglichkeiten, das zu tun? Bitte ignorieren Sie die Groß- und Kleinschreibung von Links.

Hier ist, was ich habe.

DirectoryInfo di1 = new DirectoryInfo(@"c:\temp");
DirectoryInfo di2 = new DirectoryInfo(@"C:\TEMP");

if (di1.FullName.ToUpperInvariant() == di2.FullName.ToUpperInvariant())
{ // sie sind gleich
   ...   
}

Danke.

6voto

codymanix Punkte 26958

Unter Linux könnten Sie die INode-Nummern der beiden Dateien vergleichen, ob sie identisch sind. Aber unter Windows gibt es kein solches Konzept, zumindest nicht, dass ich wüsste. Sie müssten p/invoke verwenden, um die Links aufzulösen, wenn vorhanden.

Das Vergleichen von Zeichenfolgen ist das Beste, was Sie tun können. Beachten Sie, dass die Verwendung von String.Compare(str1, str2, StringComparison.OrdinalIgnoreCase) schneller ist als Ihr Ansatz von ToUpperInvariant(), da keine neuen Zeichenfolgen im Heap allokiert werden und keine Probleme bei der Verwendung eines linguistischen Textvergleichsalgorithmus auftreten, um Dateipfade zu vergleichen.

6voto

Matthew Cole Punkte 1319

Sie können stattdessen Uri-Objekte verwenden. Ihre Uri-Objekte müssen jedoch auf eine "Datei" in diesen Verzeichnissen verweisen. Diese Datei muss tatsächlich nicht existieren.

    private void CompareStrings()
    {
        string path1 = @"c:\test\rootpath";
        string path2 = @"C:\TEST\..\TEST\ROOTPATH";
        string path3 = @"C:\TeSt\RoOtPaTh\";

        string file1 = Path.Combine(path1, "log.txt");
        string file2 = Path.Combine(path2, "log.txt");
        string file3 = Path.Combine(path3, "log.txt");

        Uri u1 = new Uri(file1);
        Uri u2 = new Uri(file2);
        Uri u3 = new Uri(file3);

        Trace.WriteLine(string.Format("u1 == u2 ? {0}", u1 == u2));
        Trace.WriteLine(string.Format("u2 == u3 ? {0}", u2 == u3));

    }

Dies gibt aus:

u1 == u2 ? True
u2 == u3 ? True

5voto

Seit netstandard2.1 gibt es endlich eine fast bequeme und plattformunabhängige Möglichkeit, dies zu überprüfen: Path.GetRelativePath().

var areEqual = Path.GetRelativePath(path1, path2) == ".";

Funktioniert mit absoluten und relativen Pfaden. Behandelt auch Fälle wie foo/../foo/bar == foo/bar korrekt.

2voto

Hertzel Guinness Punkte 5742

Inspiriert von hier:

static public bool SameDirectory(string path1, string path2)
{
    return (
        0 == String.Compare(
            System.IO.Path.GetFullPath(path1).TrimEnd('\\'),
            System.IO.Path.GetFullPath(path2).TrimEnd('\\'),
            StringComparison.InvariantCultureIgnoreCase))
        ;
}    

Funktioniert auch für Dateien...

(Übrigens sind theoretisch Fragen doppelt, aber dies ist die originale und die andere ist die am meisten beantwortete...)

HTH

0voto

Konstantin Spirin Punkte 19144

Ein Fall-unkritischer Vergleich ist das Beste, was Sie bekommen können. Extrahieren Sie es in eine Hilfeklasse, nur für den Fall, dass die Menschheit eine bessere Methode findet.

public static class DirectoryInfoExtensions
{
    public static bool IsEqualTo(this DirectoryInfo left, DirectoryInfo right)
    {
        return left.FullName.ToUpperInvariant() == right.FullName.ToUpperInvariant();
    }
}

und verwenden:

if (di1.IsEqualTo(di2))
{
    // Code hier
}

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X