List(of DirectoryInfo).Contains - Verständnisproblem

  • VB.NET
  • .NET 4.5

Es gibt 7 Antworten in diesem Thema. Der letzte Beitrag () ist von MemoAnMichSelbst.

    List(of DirectoryInfo).Contains - Verständnisproblem

    Hi,

    ich habe eine List(of IO.DirectoryInfo) - eine Art "Ausschlussliste" und möchte prüfen, ob ein Verzeichnis dieser Liste in einem anderen Verzeichnis vorhanden ist.
    Es geht darum eine permanente Löschung eines Verzeichnisses mit Unterverzeichnissen umzusetzen, ausgeschlossen einer zu definierenden Liste.
    Dafür lese ich mir eine Text-Datei ein, welche ich in eine Liste überführe.

    Spoiler anzeigen

    VB.NET-Quellcode

    1. Private Sub leseAuschlussliste(ByVal Pfad As String)
    2. Using sr As New IO.StreamReader(Pfad)
    3. Do Until sr.EndOfStream
    4. _ausschluss.Add(New IO.DirectoryInfo(sr.ReadLine))
    5. Loop
    6. End Using
    7. End Sub​

    Wobei _ausschluss eine Klassenweit verfügbare Variable ist. Das geht auch ganz problemlos.

    VB.NET-Quellcode

    1. ​Dim di As New IO.DirectoryInfo(ZuBereinigenTextBox.Text)
    2. For Each directory In di.GetDirectories
    3. If Not _ausschluss.Contains(directory) Then
    4. directory.Delete(True)
    5. End If
    6. Next


    Dieser Code hier scheint aber nicht recht zu tun, was ich erwartet hätte. Selbst wenn "direktory" in der Ausschlussliste vorkommt, wird es einfach weggebügelt.


    Habe ich hier einen dicken Denkfehler? Oder muss ich das doch ganz anders lösen?
    Es war einmal ein kleiner Bär... der wollte eine Geschichte hörn... Da erzählte ihm seine Mutti:
    Es war einmal ein kleiner Bär... der wollte eine Geschichte hörn... Da erzählte ihm seine Mutti:
    Es war einmal ein kleiner Bär... der wollte eine Geschichte hörn... Da erzählte ihm seine Mutti:
    ... Nun solltest es selber wissen. :'D
    @MemoAnMichSelbst Du solltest hier nicht mit DirectoryInfo-Instanzen arbeiten, die sind alle disjunkt, wenn die eine Partei aus einer Datei und dei andere von der Festplatte selbst kommt.
    Arbeite mit di.FullName, da können Instanzen verschiedener Herkunft auch gleich sein.
    Falls Du diesen Code kopierst, achte auf die C&P-Bremse.
    Jede einzelne Zeile Deines Programms, die Du nicht explizit getestet hast, ist falsch :!:
    Ein guter .NET-Snippetkonverter (der ist verfügbar).
    VB-Fragen über PN / Konversation werden ignoriert!

    MemoAnMichSelbst schrieb:

    Wobei _ausschluss eine Klassenweit verfügbare Variable ist.
    Wie so oft die Gretchenfrage: Welchen Datentyp hat die Variable _ausschluss?
    Vom Datentyp nämlich ist u.a. abhängig, was unter "Gleichheit" verstanden wird, und daher auch, welche Elemente in einer Liste als "die gleichen" gelten.

    Man kann der .Contains-Funktion übrigens auch eine Methode mitgeben, die definiert, was unter "gleich" verstanden wird. (nee, da muss man auf .IndexOf oder .FindIndex ausweichen, aber jdfs sowas gibts, dass man eine Definition mitgibt, was als "gleich" gelten soll.)

    ErfinderDesRades schrieb:

    Wie so oft die Gretchenfrage: Welchen Datentyp hat die Variable _ausschluss?


    Hi,

    ich dachte das wäre klar anhand des Beispiels und des Titels. Es ist eine List(of IO.DirectoryInfo).
    Ich werde mal auf den Fullname umsteigen bei der Prüfung und das ausprobieren.

    Ich nahm an, wenn ich eine Liste von DirectoryInfo nach einen DirectoryInfo durchsuche, würde das funktionieren.

    Edit: Funktioniert mit dem Fullname. Wobei das wieder ne Sache ist, wenn das eine ein UNC Pfad ist und das andere nicht. Ich muss da noch ein wenig probieren, bis es mir richtig gefällt.
    Es war einmal ein kleiner Bär... der wollte eine Geschichte hörn... Da erzählte ihm seine Mutti:
    Es war einmal ein kleiner Bär... der wollte eine Geschichte hörn... Da erzählte ihm seine Mutti:
    Es war einmal ein kleiner Bär... der wollte eine Geschichte hörn... Da erzählte ihm seine Mutti:
    ... Nun solltest es selber wissen. :'D

    MemoAnMichSelbst schrieb:

    und das andere nicht.
    Da musst Du einfach beide Instanzen in dasselbe vergleichbare Format konvertieren.
    Falls Du diesen Code kopierst, achte auf die C&P-Bremse.
    Jede einzelne Zeile Deines Programms, die Du nicht explizit getestet hast, ist falsch :!:
    Ein guter .NET-Snippetkonverter (der ist verfügbar).
    VB-Fragen über PN / Konversation werden ignoriert!

    Neu

    MemoAnMichSelbst schrieb:

    Es ist eine List(of IO.DirectoryInfo).
    [...]
    Ich nahm an, wenn ich eine Liste von DirectoryInfo nach einen DirectoryInfo durchsuche, würde das funktionieren.
    Tja, eben nicht.

    ErfinderDesRades schrieb:

    Vom Datentyp nämlich ist u.a. abhängig, was unter "Gleichheit" verstanden wird, und daher auch, welche Elemente in einer Liste als "die gleichen" gelten.
    DirectoryInfo ist eine Klasse, deren .Equals-Methode nicht überschrieben ist.
    Daher gilt die Default-Definition von "Gleichheit" für Klassen-Instanzen: Nämlich 2 Objekte sind nur dann gleich, wenn sie dasselbe Objekt sind (identische ObjektReferenz).
    Wenn du also 2 DirectoryInfos erstellst, sind diese niemals gleich, selbst wenn sie denselben Ordner addressieren.

    Wie gesagt: Es gibt Suchmöglichkeiten, denen man einfach mitgeben kann, was als "gleich" gelten soll:

    VB.NET-Quellcode

    1. Dim dis = New IO.DirectoryInfo("..\..").GetDirectories.ToList
    2. Dim diSearch = New IO.DirectoryInfo("..\..\bin")
    3. Dim diFound = dis.Find(Function(di) di.FullName = diSearch.FullName)
    4. MessageBox.Show(diSearch.Name & " ist vorhanden: " & (diFound IsNot Nothing))
    In zeile #3 ist die Suchbedingung so formuliert, dass als gleich gilt, wenn .Fullname übereinstimmt.
    Ausserdem hat List(Of T) auch noch eine ähnlich tickende .FindIndex() - Methode, die man ebensogut als .Contains-Ersatz verwenden könnte.

    Diese Dinge hat aber nur List(Of T). T-Array oder noch annere Auflistungen habens nicht.
    Wie gesagt - Gretchenfrage :)

    Dieser Beitrag wurde bereits 4 mal editiert, zuletzt von „ErfinderDesRades“ ()

    Neu

    ErfinderDesRades schrieb:

    Daher gilt die Default-Definition von "Gleichheit" für Klassen-Instanzen: Nämlich 2 Objekte sind nur dann gleich, wenn sie dasselbe Objekt sind (identische ObjektReferenz).
    Wenn du also 2 DirectoryInfos erstellst, sind diese niemals gleich, selbst wenn sie denselben Ordner addressieren.


    Das war mir absolut nicht bewusst.

    Ich werde wohl "einfach" immer UNC Pfade versuchen zu generieren und dann den FullName zum Vergleich nutzen.
    Ich werde mich morgen daran probieren, herauszufinden, wie ich hier eine sinnvolle Prüfung ob es sich schon um einen UNC Pfad handelt gestalten kann und wie ich ggfs. eine nötige Konvertierung vornehme. Da scheint es ja im .Net Framework noch nichts von Haus aus für zu geben.

    Danke erstmal für die Hilfe!
    Es war einmal ein kleiner Bär... der wollte eine Geschichte hörn... Da erzählte ihm seine Mutti:
    Es war einmal ein kleiner Bär... der wollte eine Geschichte hörn... Da erzählte ihm seine Mutti:
    Es war einmal ein kleiner Bär... der wollte eine Geschichte hörn... Da erzählte ihm seine Mutti:
    ... Nun solltest es selber wissen. :'D