Unterordner werden nicht gefunden/angezeigt

  • VB.NET
  • .NET (FX) 4.5–4.8

Es gibt 18 Antworten in diesem Thema. Der letzte Beitrag () ist von ErfinderDesRades.

    Unterordner werden nicht gefunden/angezeigt

    Hallo und guten Morgen :)

    Ich hab da ein bisschen Code, der sich manchmal nicht ganz so verhält wie er soll, weiss aber nicht, ob das wirklich ein Bug ist oder es einen anderen Grund hat.

    Und zwar soll beim Setzen der Eigenschaft AktuellerOrdner dieser nach Unterverzeichnissen und evtl. auch darin enthaltenen Dateien gesucht werden:

    VB.NET-Quellcode

    1. Private _AktuellerOrdner As String
    2. Public Property AktuellerOrdner As String
    3. Get
    4. Return _AktuellerOrdner
    5. End Get
    6. Set(value As String)
    7. Dim UnsortierteListe As New List(Of String)
    8. UnterVerzeichnisse = New ObservableCollection(Of String)
    9. Try
    10. For Each Unterverzeichnis In System.IO.Directory.GetDirectories(value)
    11. UnsortierteListe.Add(Unterverzeichnis)
    12. Next
    13. UnsortierteListe.Sort()
    14. UnterVerzeichnisse = New ObservableCollection(Of String)(UnsortierteListe)
    15. UnsortierteListe.Clear()
    16. If (Optionen = Options.OpenFile) Or (Optionen = Options.SaveFile) Then
    17. For Each Datei In System.IO.Directory.GetFiles(value)
    18. For Each DateiTyp In DateiTypen
    19. If Datei.ToLower.EndsWith(DateiTyp) Then
    20. UnsortierteListe.Add(Datei)
    21. End If
    22. Next
    23. UnsortierteListe.Sort()
    24. For Each item In UnsortierteListe
    25. UnterVerzeichnisse.Add(item)
    26. Next
    27. 'UnterVerzeichnisse.Add(Datei)
    28. Next
    29. End If
    30. UnterVerzeichnisse = New ObservableCollection(Of String)(UnterVerzeichnisse.Distinct)
    31. _AktuellerOrdner = value
    32. Catch ex As Exception
    33. MessageBox.Show("Dieser Ordner konnte nicht geöffnet werden." & Environment.NewLine & "Fehlermeldung: " & ex.Message)
    34. Return
    35. End Try
    36. RaisePropertyChanged(NameOf(UnterVerzeichnisseStrings))
    37. RaisePropertyChanged()
    38. End Set
    39. End Property


    VB.NET-Quellcode

    1. Private Sub VerzeichnisAuswaehlen_Execute(obj As Object)
    2. If (UnterVerzeichnisIndex <> -1) Then
    3. Dim IsDir As Boolean = System.IO.File.GetAttributes(UnterVerzeichnisse(UnterVerzeichnisIndex)) = FileAttributes.Directory 'kann es sein dass hier was nicht stimmt, vielleicht noch was anderes angegeben werden zusätzlich zu FileAttributes.Directory?
    4. If IsDir Then AktuellerOrdner = UnterVerzeichnisse(UnterVerzeichnisIndex)
    5. End If
    6. End Sub


    Funktioniert auch eigentlich bei allen Ordnern, ausser bei einem bestimmten, der wird nicht geöffnet (d.h, er wird nicht als leer angezeigt, sondern öfffnet sich einfach nicht!)

    Es liegt mir nahe zu glauben, dass das am Ordner selbst liegt, irgendein Attribut (also z.B. versteckt ist er nicht, aber vielleicht hab ich keinen Zugriff drauf weil z.B. mein Virenscanner blockt). Kennt sich jemand aus mit Dateiattributen und -zugriffsberechtigungen unter Windows 10 und kann was dazu sagen?

    kafffee schrieb:

    ausser bei einem bestimmten
    Was ist das für ein Ordner?
    Wo liegt der?
    Was passiert, wenn Du das Programm mit Admin-Rechten laufen lässt?
    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).
    Programmierfragen über PN / Konversation werden ignoriert!
    @kafffee Im Explorer, rechte Maustaste, Starten mit Admin-Rechten.
    Hast Du diesen Ordner von einem anderen Rechner zu Dir kopiert?
    ====
    Ansonsten musst Du das Studio als Admin starten.
    Dem Programm selbst die Admin-Rechte zu geben (app.config) ist wohl etwas zu hoch gegriffen.
    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).
    Programmierfragen über PN / Konversation werden ignoriert!
    Du verwendest das mit den Attributen falsch, können mehrere Attribute sein, dann trifft deine Bedingung einfach nicht zu, obwohl ein Ordner, um das zu verstehen, musst du schon BitWise-Operation verstehen, hier siehst du wie man auf ein bestimmtes Attribut testet:
    learn.microsoft.com/de-de/dotn…etattributes?view=net-7.0


    PS @kafffee
    Wäre nicht einfach IO.Directory.Exists das richtige?
    Zitat von mir 2023:
    Was interessiert mich Rechtschreibung? Der Compiler wird meckern wenn nötig :D

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von „DTF“ ()

    Wenn das mit Admin nicht geht, liegt ein anderer Effekt / Fehler vor.
    Wie äußert sich das

    kafffee schrieb:

    sondern öfffnet sich einfach nicht
    ?
    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).
    Programmierfragen über PN / Konversation werden ignoriert!
    @kafffee
    Gib mir mal das was System.IO.File.GetAttributes(UnterVerzeichnisse(UnterVerzeichnisIndex)) dir gibt, dann nehmen wir das mal auseinander(den Wert).

    PS
    Solltest du zu integer casten können, das brauch ich.

    Du kannst aber auch den Rückgabewert selbst anders auswerten und mit FileAttribute.HasFlag auf ein Attribute testen.


    Zitat von mir 2023:
    Was interessiert mich Rechtschreibung? Der Compiler wird meckern wenn nötig :D

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von „DTF“ ()

    Also vorab: Mit dem Vorschlag von @DTF funktionierts. Ist trotzdem irgendwie komisch... Aber wir müssen nicht in die Tiefe gehen, nur wenn ihr Bock habt...

    @RodFromGermany

    Ich habe eine Listbox, welche mir die Unterverzeichnisse (und Dateien anzeigt). Bei Doppelklick auf ein Item, also in dem Fall (C:\Users\User\Documents\eigene\raps) soll dann wiederum der Inhalt dieses Ordners angezeigt werden (durch ausführen von VerzeichnisAuswaehlen_Execute(obj As Object))

    Passiert aber bei diesem Ordner nicht. Da doppelklicke ich drauf und nix passiert.

    @DTF

    DTF schrieb:

    Wäre nicht einfach IO.Directory.Exists das richtige?

    Ja damit gehts :) warum einfach wenns auch kompliziert geht??

    DTF schrieb:

    Gib mir mal das was System.IO.File.GetAttributes(UnterVerzeichnisse(UnterVerzeichnisIndex)) dir gibt, dann nehmen wir das mal auseinander(den Wert).


    48

    DTF schrieb:

    musst du schon BitWise-Operation verstehen


    Ist das sowas wie bei den Flags der bass.dll? Wo man dann z.B. BASS_DEFAULT Or BASS_PRESCAN macht (ist jetzt nur ein Besipiel)?

    BTW: Weiss jemand was dieses Kästchen vor Schreibgeschützt (betrifft nur Dateien im Ordner) (s.Screenshot) heisst? Das wollte ich schon immer mal wissen. Weil wenn ich da drauf klicke und das Häkchen setze, dann Ok Klicke und dann erneut die Dateieigenschaften aufrufe dann ist es wieder ein Kästchen...
    Bilder
    • allgemein.png

      4,17 kB, 400×112, 43 mal angesehen

    kafffee schrieb:

    Aber wir müssen nicht in die Tiefe gehen, nur wenn ihr Bock habt...


    So tief ist das nicht, wenn man mit BitwiseOperations vertraut ist, und ja, das ist wie bei der BASS.

    OK 48, stellen wir das mal Binär dar:
    00110000

    Da sind 2 Bits Gesetzt, also habe wir 2 Attribute

    Directory:
    16
    00010000
    Archive:
    32
    00100000
    Total:
    48
    00110000

    Also Directory Or Archive = 48, kann also niemals "nur" Atrribute.Directory(16) sein, wie in deiner Bedingung.

    PS @kafffee
    Damit Vollständig:
    48 And 16 = 16
    Also so testen if Attritubes and Flag = Flag then aha, dann kommt in deinem Fall mit der 48 und 16 als Flag true
    Zitat von mir 2023:
    Was interessiert mich Rechtschreibung? Der Compiler wird meckern wenn nötig :D

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

    Ja kein Problem, hier war das ja nicht wirklich offensichtlich, da wären viele wenn sie es wie du gemacht hätten drüber gestolpert.

    kafffee schrieb:

    warum einfach wenns auch kompliziert geht??

    Richtig! Bin auch grad dabei alles zu verkomplizieren. nicht nur gefilterte Datenansichten, sondern auch mit eigenen IComparer, dann kriege ich aber komische Bindungsfehler, aber nur ab und zu. (Da ist zwischendurch wohl kurz was null und ein ListViewItem(AlbenAnsicht mit Cover, Details zum Album dann in einem DataGrid) kann mit FindAncestor nicht gefunden werden. 1 Tag such ich schon...

    Will ja Alben in der richtigen Reihenfolge und nicht so:

    Album 1
    Allbum 10
    Album 2
    Album 3
    Zitat von mir 2023:
    Was interessiert mich Rechtschreibung? Der Compiler wird meckern wenn nötig :D
    Das würde ich nicht machen, ich mag keine führenden nullen bei sowas. bspl. Bravo Hits 001, mal ehrlich, wie schaut das aus? Erstell dir eine Klasse die IComparer implementiert und sortiere selbst. Das ist aber nicht wirklich trivial, hatte auch bei mir gedauert, bis alles wirklich richtig sortiert war. Zur Not erstelle ich eine Kopie der Collection, sortiere die und verwerfe danach dann die alte, dann sollte auch das mit den Bindungsfehlern weg sein, angezeigt wird ja alles richtig. Beim sortieren ist wohl kurz hier und da DataItem mal null, beim sortieren einer Kopie kann das ja nicht passieren.

    PS, man könnte evtl. auch in der Modelklasse IComparable implementieren.
    Zitat von mir 2023:
    Was interessiert mich Rechtschreibung? Der Compiler wird meckern wenn nötig :D
    Hab mein Problem lösen können, auf SO wurde ich fündig. Nachdem ich meine Klasse die IComparer implementiert drin hatte, beim Programmstart alles gut, keine Bindungsfehler, sobald ich aber gefiltert hab, gabs für jedes item einen Fehler, "System.Windows.Data Error: 4 : Cannot find source for binding with reference", die Debugausgabe hörte nicht mehr auf. :S Ohne den IComparer also mit standart-sortierung passierte das nicht, auch nicht mit Filter. Das bisher verrückteste Problem das ich bisher mit WPF hatte. Hing wohl mit defaultwerten beim style, bzw. den defaultstyle zusammen.
    Das war die Lösung:(das hinzuzufügen)
    Spoiler anzeigen

    stackoverflow.com/questions/16…uces-weird-binding-errors

    XML-Quellcode

    1. <ListView.Resources>
    2. <Style TargetType="ListViewItem">
    3. <Setter Property="HorizontalContentAlignment" Value="Center" />
    4. <Setter Property="VerticalContentAlignment" Value="Top" />
    5. </Style>
    6. </ListView.Resources>
    7. <ListView.ItemContainerStyle>
    8. <Style TargetType="ListViewItem">
    9. <Setter Property="HorizontalContentAlignment" Value="Center" />
    10. <Setter Property="VerticalContentAlignment" Value="Top" />
    11. </Style>
    12. </ListView.ItemContainerStyle>

    Zitat von mir 2023:
    Was interessiert mich Rechtschreibung? Der Compiler wird meckern wenn nötig :D

    Dieser Beitrag wurde bereits 2 mal editiert, zuletzt von „DTF“ ()