Icon aus Datei Extrahieren -> FTP

  • VB.NET

Es gibt 62 Antworten in diesem Thema. Der letzte Beitrag () ist von ~blaze~.

    Ja soweit kann ich mittlerweile folgen. Habe mich ja auch jetzt Tage damit beschäftigt.
    Bei mir hakt es jetzt nur ein wenig im Ablauf.

    Ich versuche das mal schematisch darzustellen, weil den ganzen Code Posten(über mehrere klassen usw.)
    mach keinen Sinn.

    Form1 hat ein TreeView (erstmal) und eine ComboBox, sonst nichts.
    Nach der Auswahl in der ComboBox ( File, Folder, File & Folder), knattert schon eine Instanz los
    (BackGroundWorker, Delegate, Invoke).

    Dim Neue_Instanz .....
    .Start_Load_TreeView(TreeView1, FTP_Verzeichnis, FTP_User, FTP_Passwort, Folder&Files......... usw.)
    End

    So diese Instanz bringt mir das komplette FTP_Verzeichnis inkl. Folder u. Files zurück als fertiges TreeView zurück.
    bisher alles soweit OK.

    Aber jetzt drehe ich mich im Kreis, ich zumindest.

    Die Klasse sammelt alle Daten vom FTP. OK
    Innerhalb der Klasse

    Ich kann die ImageListe erst zusammenstellen, wenn ich den Response vom FTP habe.
    Weil ich dann erst weis, welche überhaupt benöfigt werden.
    mhhh, dann bin ich aber in einer neuen Instanz, wenn ich nun die Icon anhand der Regestrierung ermittel,
    bekomme ich sie, kann sie der TreeView (anhand der ImageListe) zuweisen.
    Sie kommen dann auch in Form1 an. (währe ja gelacht wenn ~blaze~ da ein fehler gemacht hätte)

    - Jetzt kommt aber mein Ratenschwanz
    Wähle ich in TreeView nun ein Node(Folder) mit DoppelKlick aus, soll er den Rest des Folders auslsen und zurückbringen.
    Geht natürlich auch mit der neuen Instanz.
    Aber genau das ist ja der haken, bei jeder neuen Instanz ladet er ja wieder alles von vorne.

    Ich suche nun eine Möglichkeit, wie ich das doppelte umgehen kann.

    Vielleicht umständlich erklärt.

    wenn noch fragen sind
    ich laufe ja nicht weg

    danke
    Bernd
    Nur damit ich dich nicht falsch verstehe.

    Das Icon suchen und in die ImageListe packen , soll in ein Extra Klasse.
    Die kann ich dann ohne neu zu Instanzieren, ansprechen und erweitern !

    Also könnte ich eine Property nehmen
    Public Shared ....

    aber wann schupse ich die das erste mal an ?

    Beim auslesen der Root ! denke ich

    Beim auslesen der nächsten Knoten , Kontrolle und ggf. erweitern.

    mhhh
    müsste gehn

    ich bastel mal

    danke danke danke

    manchmal braucht man einen Schups, oder mal wirklich ne Pause.
    Die ImageList gibt's auch als Komponente in der Toolbox. Erstell dir eine und setze im Eigenschaftenfenster die Eigenschaft ImageList der TreeView auf die erstellte ImageList. Dieser ImageList kannst du dann alle Bilder mit Key hinzufügen, wenn der Key noch nicht vorhanden ist (als Key einfach Extension.ToLowerInvariant() wählen). Wenn es für eine Extension kein Icon gibt, übernimmst du einfach das Bild mit dem Index 0.
    Das wäre z.B. so:

    VB.NET-Quellcode

    1. Private Function GetExtensionIconIndex(ByVal extension As String) As Integer
    2. Dim index As Integer
    3. extension = extension.ToLowerInvariant() 'Grossbuchstaben durch Kleinbuchstaben ersetzen
    4. index = ImageListInstance.Images.IndexOfKey(extension)'Index des Keys des Icons herausfinden
    5. If index = -1 Then 'Ist die Extension nicht vorhanden...
    6. Dim icon As Icon = GetIcon(extension) '... wird das Icon neu ausgelesen
    7. If icon Is Nothing Then 'Konnte kein Icon ermittelt werden...
    8. '... wird wieder das Standardbild hinzugefuegt, diesmal mit dem Key der Extension
    9. ImageListInstance.Images.Add(extension, ImageListInstance.Images(0))
    10. Else
    11. 'ansonsten wird das Icon in die Liste eingereiht
    12. ImageListInstance.Images.Add(extension, icon)
    13. End If
    14. index = ImageListInstance.Images.Count -1 'der Index des neuen Bildes ist das letzte Item in der Auflistung
    15. Return index
    16. End Function


    Es wäre wahrscheinlich eleganter, eine zweite Liste (bzw. ein Dictionary) einzuführen, die den Extensions die Indices zuweist. Ich denke mal, dass die ImageList immer kleine Bildchen für die großen erzeugt, da die Größe aller Bilder ja immer an die ImageSize-Eigenschaft angepasst wird.

    Du musst übrigens der ImageList ein Bild hinzufügen (mit dem Index 0), das verwendet werden soll, wenn kein Bild verfügbar ist (also GetIcon(String) Nothing zurückgibt).

    Gruß
    ~blaze~
    Aber genau diesen Punkt möchte ich nicht.
    "Erstelle eine ImageListe aus der ToolBox."

    Ich möchte das soweit wie oben beschrieben Fehlerfrei vorbereiten.
    Wenn alles vorbereitet ist. Also wenn die TreeView komplett zurückkommt.
    Dann läuft der erste Schritt ...

    Zensiert
    '
    '
    '
    '

    Ziehe ich das Control auf meine Form, brauche ich in den Propertys nur noch die
    FTP Zugangsdaten und die Adresse eingeben.
    Peng, alles erledigt.

    Somit soll alles in Klassen ablaufen.
    Aber ich kann in der Klasse ja eine ImageListe erstellen, und dort alle Einstellungen vornehmen.
    Dann mit deiner Methode das erledigen.

    Jetzt brauche ich ein wenig Zeit um das umzusetzen.



    Puh, nun habe ich einiges zu Basteln und zu Probieren.
    Aber ich setze mich mal in aller ruhe dran.
    Mals sehen ob meine Geduld und Ausdauer siegen.

    Danke Dir

    PS:
    scheint dich ja brennend zu interessieren. Cool.

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

    Ich gebe mir Mühe.

    kann jetzt ein paar Tage dauern. Habe diese Woche wenig Zeit.
    Aber ich stelle mir den Wecker mal 2 Stunden früher. Dann habe ich etwas Zeit rausgeholt.

    nochmals vielen dank

    Wenn ich weiter bin lasse ich es dich wissen.
    Wenn nicht, nerve ich weiter.


    vielen lieben dank
    Bernd

    Bernd schrieb:

    Extrahiert aber wieder nur das Icon aus einer vorhanden Datei.
    Und was ist wenn die Datei kein Icon hat ?

    Nein, es ist das Icon, das von z.B. Word oder Excel bereitgestellt wird. NICHT das aus der Datei. Wenn ein Dateityp nicht registriert ist, dann kommt halt das Standard-Icon "Weißes Blatt".
    Ich habe jetzt mal versucht,

    If
    in der ImageListe nachschauen ob der key (".ext") vorhanden ist
    True -> wenn ja als ImageIndex = zuweisen
    False -> wenn nein, dann in der Regestrie nachschauen ob eine Schlüssel hinterlegt ist
    Regestrie = True Then
    In die ImageListe eintragen
    und ImageIndex = zuweisen
    Regestrie = False
    ImageIndex = 0


    So das versuche ich jetzt in Worte hin zu bekommen,

    Ich gehe mit einer Schleife die FTP Liste durch.
    Wenn der Eintrag ein File ist , dann schau mal in der ImageListe ob dafür ein schönes(passendes) Icon vorhanden ist.
    Wenn ja dann weise das Icon dem ImageIndex zu. Wenn nein dann schau mal in der Regestrierung ob für diesen Dateityp ein Icon hinterlegt ist. Wenn eins hinterlegt ist dann hol es und bring es in die ImageListe. Gleichzeitig weist du dem ImageIdex den Key zu. Wenn in der Regestrie kein Icon vorhanden ist, dann weise dem ImageIdex eine 0 zu.

    So das ganze läuft dann mit fehler,
    1. Fehler er bricht das auslesen beim FTP mittendrin ab. (willkürlich)
    2. Je öfter ich die Methode starte, je mehr richtige Icons werden gefunden. Bis irgendwann alle Icon richtig zugeordnet sind. dann ist aber auch der Fehler mit dem abholen der Dateien beim FTP weg.

    Jetzt bin ich verwirrt.
    Ich dachte das liegt an den verschiedenen Klassen bzw. Instanzen.
    Darauf hin habe ich alles mal in ein Projekt gepackt. Halt nur in Klassen aufgeteilt.
    Ne Ne, das bleibt dann so.

    Hier mal der kleine Teil bei dem er sich die Fehler einhandelt.


    Wenn ich die auskommentierten Zeilen, einzeln oder auch zusammen, wieder aufnehme kommen die Fehler. Lasse ich die weg, sind keine Fehler vorhanden und es läuft super.

    Wo mach ich da meinen Denkfehler
    - ImageListe
    - Einzeln die Icon über Regestrie ermitteln ? lieber doch die komplette liste in einem Rutsch
    - Hat es vieleicht damit zu tun das ich mich in verschiedenen Instanzen bewege ?

    Ich habe so einiges an Tests durch.

    Nu habe ich keine Idee mehr.

    Aber Ihr vielleicht.

    Danke

    Bernd

    Ups: Vergessen
    Spoiler anzeigen

    VB.NET-Quellcode

    1. Else
    2. ' Files einsammeln und dem TreeNode unterjubeln
    3. Dim fileName As String = fileNames.First(Function(r) line.EndsWith(r)) 'Dim fileName As String = fileNames.First(Function(f) line.EndsWith(f))
    4. 'lNode_Files = New TreeNode(line.ToString)
    5. lNode_Files = New TreeNode(fileName)
    6. lNode_Files.Name = folder & fileName
    7. ' In der Image Liste nachschauen
    8. Dim Index_Of_Icon As Integer = 0
    9. Index_Of_Icon = Check_Icon_In_ImageList(IO.Path.GetExtension(fileName))
    10. ' Wenn ich diese Zeile einblende kommen die falschen Infos zurück
    11. '' In der Regestrierung nachschauen
    12. 'If Index_Of_Icon = -1 Then
    13. ' Index_Of_Icon = Check_Icon_In_Regestrie(IO.Path.GetExtension(fileName))
    14. ' Index_Of_Icon = Check_Icon_In_ImageList(IO.Path.GetExtension(fileName))
    15. 'End If
    16. lNode_Files.ImageIndex = Index_Of_Icon
    17. lNode_Files.SelectedImageIndex = Index_Of_Icon
    18. ''lNode_Files.ImageIndex = 2
    19. ''lNode_Files.SelectedImageIndex = 3
    20. ' ... Start Last Modified auslesen
    21. ftp = DirectCast(FtpWebRequest.Create(folder & fileName), FtpWebRequest)
    22. ftp.Credentials = credentials
    23. ftp.UsePassive = False
    24. ftp.Method = WebRequestMethods.Ftp.GetDateTimestamp
    25. Dim FtpI_Resp As FtpWebResponse = CType(ftp.GetResponse, FtpWebResponse)
    26. FtpI_Resp.Close()
    27. ' ... Ende Last Modified auslesen
    28. lNode_Files.Tag = "f#" & Set_Tag_Values(line.ToString, FtpI_Resp.LastModified.ToString)
    29. lNodes_Files_List.Add(lNode_Files)
    30. End If
    31. line = reader.ReadLine()

    Function Check_Icon_In_ImageList
    Spoiler anzeigen

    VB.NET-Quellcode

    1. ' Check das Icon in der ImageListe, wenn vorhanden geb es zurück
    2. Public Shared Function Check_Icon_In_ImageList(ByVal Extension_ As String) As Integer
    3. Extension_ = Extension_.ToLowerInvariant()
    4. ' Wenn das Icon schon in der Liste ist, geb den Index zurück
    5. If _My_ImageListe.Images.ContainsKey(Extension_) Then
    6. Return _My_ImageListe.Images.IndexOfKey(Extension_)
    7. Else
    8. Return -1
    9. End If
    10. End Function

    Function Check_Icon_In_Regestrie
    Spoiler anzeigen

    VB.NET-Quellcode

    1. ' Check ob in der Regestrie ein Icon hinterlegt ist,
    2. ' ... wenn nein dann gibt er den Index 0 für das Fragezeichen zurück
    3. ' ... wenn ja nimmt er es in der ImageLsite auf und gibt den Index in der ImageListe zurück
    4. Public Shared Function Check_Icon_In_Regestrie(ByVal Extension_ As String) As Integer
    5. Dim Icn As Icon
    6. Icn = GetIcon(Extension_)
    7. If Icn Is Nothing Then
    8. Return 0
    9. Else
    10. _My_ImageListe.Images.Add(Extension_.ToLowerInvariant, Icn)
    11. 'Return Check_Icon_In_ImageList(Extension_)
    12. Return _My_ImageListe.Images.Count - 1
    13. End If
    14. End Function

    Spoiler anzeigen

    VB.NET-Quellcode

    1. ätsch, nix mehr

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

    Registry mit y ;).

    VB.NET-Quellcode

    1. Index_Of_Icon = Check_Icon_In_Regestrie(IO.Path.GetExtension(fileName))
    2. Index_Of_Icon = Check_Icon_In_ImageList(IO.Path.GetExtension(fileName))

    Hier brauchst du den 2. Aufruf gar nicht oder? Hast du ein Bild 0 reingetan, wie ichs dir gesagt hatte (das Standardicon, das zu verwenden ist, wenn in der Registry keins definiert wurde oder das nicht verfügbar ist)?
    Eine Abfolge von ContainsKey und IndexOfKey geht doppelt die Items durch. IndexOfKey gibt -1 zurück, wenn kein Eintrag mit dem Key vorhanden ist.
    Ich würde übrigens nicht IO.Path.GetExtension verwenden. Internetpfade sind ja mit / und nicht mit \. Damit klar ist, was du meinst, würde ich StringInstance.Substring(StringInstance.LastIndexOf("."c)) verwenden.

    Gruß
    ~blaze~

    ~blaze~ schrieb:

    Hier brauchst du den 2. Aufruf gar nicht oder?

    Nein, ich habe alles mal durchgetestet. Nur nicht rausgenommen, nur auskommentiert.

    Den Rest schaue ich mir mal an.

    VB.NET-Quellcode

    1. Public Sub New()
    2. ' Image Liste mit Standart füllen
    3. _My_ImageListe.Images.Add("leer", My.Resources.Fragezeichen)
    4. _My_ImageListe.Images.Add(".folderwhite", My.Resources.folder)
    5. _My_ImageListe.Images.Add(".foldergreen", My.Resources.folder_green)
    6. _My_ImageListe.Images.Add(".php", My.Resources.Files_text)


    ~blaze~ schrieb:

    Eine Abfolge von ContainsKey und IndexOfKey geht doppelt die Items durch.

    Wie kann man das den verkürzen ?
    Ich muss den erstmal fragen ob er da ist , wenn ja dann hol ihn ?
    mhhh

    VB.NET-Quellcode

    1. If _My_ImageListe.Images.ContainsKey(Extension_) Then Return ????

    kein Ahnung

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

    VB.NET-Quellcode

    1. Dim index As Integer = imageList.IndexOfKey(".bla")
    2. If index = -1 Then
    3. 'nicht enthalten
    4. Else
    5. 'enthalten
    6. End If

    Man könnte auch direkt den Rückgabewert als Ziel nehmen:

    VB.NET-Quellcode

    1. Public Shared Function Check_Icon_In_ImageList(ByVal Extension_ As String) As Integer
    2. Extension_ = Extension_.ToLowerInvariant()
    3. Check_Icon_In_ImageList = _My_ImageListe.Images.IndexOfKey(Extension_)
    4. ' Wenn das Icon schon in der Liste ist, geb den Index zurück
    5. If Check_Icon_In_ImageList = -1 Then
    6. Return -1
    7. Else
    8. Return Check_Icon_In_ImageList
    9. End If
    10. End Function

    Hier wirds wiederum unnötig, weswegen man auch einfach folgendes machen könnte:

    VB.NET-Quellcode

    1. Public Shared Function Check_Icon_In_ImageList(ByVal Extension_ As String) As Integer
    2. Return _My_ImageListe.Images.IndexOfKey(Extension_.ToLowerInvariant())
    3. End Function

    Was kommt denn als Fehlermeldung oder funktionierts schon?

    Gruß
    ~blaze~
    Ich habe mal weiter gebastelt, (anders kann man das mittlerweile nicht mehr nennen).
    Ich habe alles mal eingekürzt wie von dir Beschreiben.
    Nun konnte ich aber den Fehler eingrenzen.

    Die ImageListe

    VB.NET-Quellcode

    1. Public Sub New()
    2. ' Auf 32 Bit stellen
    3. _My_ImageListe.ColorDepth = ColorDepth.Depth32Bit
    4. ' Image Liste mit Standart füllen
    5. _My_ImageListe.Images.Add("leer", My.Resources.Fragezeichen)
    6. _My_ImageListe.Images.Add(".folderwhite", My.Resources.folder)
    7. _My_ImageListe.Images.Add(".foldergreen", My.Resources.folder_green)
    8. _My_ImageListe.Images.Add("Parkverbot", My.Resources.Falsch)

    Icon in ImageListe suchen

    VB.NET-Quellcode

    1. ' Suche das Icon in der ImageListe, wenn vorhanden dann geb den Index zurück
    2. Public Shared Function Check_Icon_In_ImageList(ByVal Extension_ As String) As Integer
    3. Extension_ = Extension_.ToLowerInvariant()
    4. Return _My_ImageListe.Images.IndexOfKey(Extension_.ToLowerInvariant())
    5. End Function

    Icon in Regestr(y) :love: suchen -> Ich wusste bisher auch nciht das man LRS mit K schreibt. ?(

    VB.NET-Quellcode

    1. ' Check ob in der Regestrie ein Icon hinterlegt ist,
    2. ' ... wenn nein dann gibt er den Index 3 für das Parkverbot zurück
    3. ' ... wenn ja nimmt er es in der ImageLsite auf und gibt den Index in der ImageListe zurück
    4. Public Shared Function Check_Icon_In_Regestry(ByVal Extension_ As String) As Integer
    5. Extension_ = Extension_.ToLowerInvariant
    6. Dim Icon_ As Icon
    7. Icon_ = GetIcon(Extension_)
    8. If Icon_ Is Nothing Then
    9. Return 3 ' Parkverbot, nur zur besseren Ansicht
    10. Else
    11. ' ... lasse ich diese beiden raus, läuft das Projekt sauber durch
    12. ' ... halt ohne die richtigen Icon
    13. '_My_ImageListe.Images.Add(Extension_, Icon_)
    14. 'Return _My_ImageListe.Images.Count - 1
    15. Return 0 ' für Dateien die nicht Identifiziert wurden
    16. End If
    17. End Function

    Damit ist der Fehler eingegrenzt.

    Der Aufruf: alles schön einzeln, damit es für mich besser lesbar ist. (lachen erlaubt)

    VB.NET-Quellcode

    1. ' ... In der Image Liste nachschauen
    2. ' geändert wegen DOS(\) bzw FTP(/)
    3. Dim Index_Of_Icon As Integer = Check_Icon_In_ImageList(fileName.Substring(fileName.LastIndexOf("."c)))
    4. If Index_Of_Icon = -1 Then
    5. 'nicht enthalten
    6. ' ... dann schau in der Regestry nach
    7. Dim Idex_Aus_Regy As Integer = Check_Icon_In_Regestry(fileName.Substring(fileName.LastIndexOf("."c)))
    8. If Idex_Aus_Regy = 0 Then
    9. lNode_Files.ImageIndex = 0
    10. lNode_Files.SelectedImageIndex = 0
    11. Else
    12. lNode_Files.ImageIndex = Idex_Aus_Regy
    13. lNode_Files.SelectedImageIndex = Idex_Aus_Regy
    14. End If
    15. Else
    16. 'enthalten
    17. lNode_Files.ImageIndex = Index_Of_Icon
    18. lNode_Files.SelectedImageIndex = Index_Of_Icon
    19. End If


    Jetzt versuche ich dahinter zu steigen
    - warum ?
    - wieso die Liste erst bei mehrmaligem Starten erweitert wird ?

    Weiter im Text:
    Ich habe gefunden wo er aussteigt. Ich lasse mir den Index der ImageListe mit einer MessageBox anzeigen. Nun habe ich gemerkt, das er beim eintragen in der ImageListe "aussteigt". Er Steigt aus der Routine aus, von der aus gestartet wurde.
    Das bedeutet, er liest nicht weiter die Folder und Files vom Ftp aus.

    Kurz
    - steigt aus beim schreiben in die ImageListe
    - steigt aus beim lesen der FTP Liste
    beides ohne Fehlermeldung oder beenden des Programm.

    VB.NET-Quellcode

    1. ' Check ob in der Regestrie ein Icon hinterlegt ist,
    2. ' ... wenn nein dann gibt er den Index 3 für das Parkverbot zurück
    3. ' ... wenn ja nimmt er es in der ImageLsite auf und gibt den Index in der ImageListe zurück
    4. Public Shared Function Check_Icon_In_Regestry(ByVal Extension_ As String) As Integer
    5. Extension_ = Extension_.ToLowerInvariant
    6. Dim Icon_ As Icon
    7. Icon_ = GetIcon(Extension_)
    8. If Icon_ Is Nothing Then
    9. Return 3 ' Parkverbot, nur zur besseren Ansicht
    10. Else
    11. ' ... lasse ich diese beiden raus, läuft das Projekt sauber durch
    12. ' ... halt ohne die richtigen Icon
    13. MessageBox.Show(Extension_) ' kommt an
    14. MessageBox.Show((_My_ImageListe.Images.Count - 1).ToString) ' kommt an
    15. _My_ImageListe.Images.Add(Extension_, Icon_) ' hier steigt er aus
    16. MessageBox.Show((_My_ImageListe.Images.Count - 1).ToString) ' kommt nicht mehr an
    17. Return _My_ImageListe.Images.Count - 1
    18. ' Return 0 ' für Dateien die nicht Identifiziert wurden
    19. End If
    20. End Function

    Er zeigt mir aber noch die Informationen über das Bild an. (Größe, Handel usw.... an)
    Leider kann mein Snipping Tool das nicht. Habe nur XP und ein selbstgeschriebenes.

    Schlechtes Bild.
    Den ersten Stop macht er wie vorher beschreiben. nehme ich den ersten Stop raus. Und setzt ihn eins weiter.
    Macht er keinen Stop mehr. Den Ignoriert er einfach.

    VB.NET-Quellcode

    1. Else
    2. ' ... lasse ich diese beiden raus, läuft das Projekt sauber durch
    3. ' ... halt ohne die richtigen Icon
    4. ' Stop ' den Stop macht er
    5. _My_ImageListe.Images.Add(Extension_, Icon_) ' hier steigt er aus
    6. Stop ' Den Stop macht er schon garnicht mehr
    7. MessageBox.Show((_My_ImageListe.Images.Count - 1).ToString) ' kommt nicht mehr an
    8. Return _My_ImageListe.Images.Count - 1
    9. ' Return 0 ' für Dateien die nicht Identifiziert wurden
    10. End If



    Ganz anderer Ansatz:
    Ich habe jetzt mal folgendes gemacht.
    Gleich nach dem auslesen der Folder und Verzeichnisse, die werden in einer ListOf zwischen gespeichert,
    habe ich die Funktion die die Registry einträge prüft, angeworfen.
    Dann sollte er eigentlich die ImageListe mit den Einträfen füllen die bisher nicht vorhanden sind.
    Auch da Steigt das Programm ohne Fehlermeldung aus. Bzw. es läuft weiter bringt aber das gewünschte TreeView nicht mehr zu rück. Also wird der Fehler in der Methode
    Public Shared Function Check_Icon_In_Regestry(ByVal Extension_ As String) As Integer
    liegen.

    Nach dem auslesen der Folder und Files

    VB.NET-Quellcode

    1. Do While folderNames.Count > 0
    2. Dim folder As String = folderNames.Dequeue()
    3. Dim fileNames As New List(Of String)()
    4. ' Verbindung aufbauen und Abfrage schicken
    5. Dim ftp As FtpWebRequest = DirectCast(FtpWebRequest.Create(folder), FtpWebRequest)
    6. ftp.Credentials = credentials
    7. ftp.UsePassive = False
    8. ftp.Method = WebRequestMethods.Ftp.ListDirectory
    9. ' Alles auflisten
    10. Using response = ftp.GetResponse().GetResponseStream()
    11. Using reader As New StreamReader(response, Encoding.ASCII)
    12. Dim line As String = reader.ReadLine()
    13. While line IsNot Nothing
    14. fileNames.Add(line.Trim())
    15. line = reader.ReadLine()
    16. End While
    17. ' ... kleiner Umbau um zu sehen ob wirklich alle vorhanden sind
    18. ' ... geht einwandfrei
    19. Dim sb As New System.Text.StringBuilder()
    20. For Each Eintrag As String In fileNames
    21. sb.AppendLine(Eintrag)
    22. Next
    23. 'MessageBox.Show(sb.ToString())
    24. ' ... jetzt dir ImageListe bestücken, mit allen Extension die
    25. ' ... vorhanden sind
    26. For Each Ding As String In fileNames
    27. ' und genau hier steigt er wieder aus.
    28. Check_Icon_In_Regestry(Ding.Substring(Ding.LastIndexOf("."c)))
    29. Next
    30. End Using
    31. End Using

    Zeile 29 soll ja die ImageListe wie folgt füllen

    VB.NET-Quellcode

    1. ' Check ob in der Regestrie ein Icon hinterlegt ist,
    2. ' ... wenn nein dann gibt er den Index 3 für das Parkverbot zurück
    3. ' ... wenn ja nimmt er es in der ImageLsite auf und gibt den Index der ImageListe zurück
    4. Public Shared Function Check_Icon_In_Regestry(ByVal Extension_ As String) As Integer
    5. Extension_ = Extension_.ToLowerInvariant
    6. Dim index As Integer
    7. index = _My_ImageListe.Images.IndexOfKey(Extension_) 'Index des Keys des Icons herausfinden
    8. If index = -1 Then 'Ist die Extension nicht vorhanden...
    9. Dim icon As Icon = GetIcon(Extension_) '... wird das Icon neu ausgelesen
    10. If icon Is Nothing Then 'Konnte kein Icon ermittelt werden...
    11. '... wird wieder das Standardbild hinzugefuegt, diesmal mit dem Key der Extension
    12. _My_ImageListe.Images.Add(Extension_, _My_ImageListe.Images(0))
    13. Else
    14. 'ansonsten wird das Icon in die Liste eingereiht
    15. _My_ImageListe.Images.Add(Extension_, icon)
    16. End If
    17. index = _My_ImageListe.Images.Count - 1 'der Index des neuen Bildes ist das letzte Item in der Auflistung
    18. Return index
    19. End If
    20. End Function


    Wie gesagt im oberen Code Zeile 29 ist hängen im Schacht.

    mhhh
    ist in der Funktion vielleicht doch ein Fehler ?
    kann es sein das, das auslesen der Regestry zu lange dauert ? glaub ich nicht.

    Jetzt habe ich die Methoden soweit verstanden. Blicke also halbwegs durch.
    Leider komme ihc nicht drauf wo der Fehler sein kann.


    So ich habe noch einen Versuch mit der neuen Abfrage gestartet.
    Gleich nachdem die Folder & File Liste vom Server abgeholt ist.

    VB.NET-Quellcode

    1. '' ... kleiner Umbau um zu sehen ob wirklich alle vorhanden sind
    2. '' ... geht einwandfrei
    3. 'Dim sb As New System.Text.StringBuilder()
    4. 'For Each Eintrag As String In fileNames
    5. ' sb.AppendLine(Eintrag)
    6. 'Next
    7. ''MessageBox.Show(sb.ToString())

    Wie erwartet wird die Liste zusammen gestellt.
    Also weiter

    VB.NET-Quellcode

    1. ' Neue Suche für die Icons
    2. ' Dim icon As Icon ' mal nach unten gesetzt
    3. Dim extensionIndex, iconIndex As Integer
    4. Dim extension As String
    5. Dim Zahler As Integer = 0
    6. For Each Ding As String In fileNames
    7. extensionIndex = Ding.LastIndexOf("."c)
    8. If extensionIndex = -1 Then 'kein Punkt gefunden --> Ordner (oder Datei ohne Extension?)
    9. iconIndex = 1 'Ordnericon ist jetzt mal an der Position 1
    10. Else
    11. 'Erweiterung finden
    12. extension = Ding.Substring(extensionIndex).ToLowerInvariant()
    13. 'Icon index bestimmen
    14. iconIndex = My_ImageListe.Images.IndexOfKey(extension)
    15. 'wenn kein Icon in der Liste ist, ist der IconIndex -1
    16. If iconIndex = -1 Then 'Kein Icon gefunden...
    17. '--> Icon bestimmen
    18. ' icon = GetIcon(extension) ' könnte ja sein das da noch Müll ddrin steht
    19. ' Aus diese Methode kommt er nur --> einmal <-- zurück
    20. Zahler += 1
    21. Dim icon As Icon = GetIcon(extension) ' lieber neu deklarieren
    22. ' ... anzeigen lassen wie oft er raus kommt
    23. MessageBox.Show("bin zurück von Runde " & Zahler.ToString)
    24. 'Icon index ist die Anzahl der Icons, da das Icon ja noch nicht drinsteht
    25. iconIndex = My_ImageListe.Images.Count
    26. 'Icon hinzufuegen
    27. My_ImageListe.Images.Add(icon)
    28. End If
    29. End If
    30. Next

    Aus Zeile 25 kommt er nur einmal zurück.

    Also noch weiter,
    Die Übergabe an My_ImageListe kommt nicht durch.
    Ich vermute da das ganze Thread übergrifend läuft.

    Ich suche weiter.

    Danke ~blaze~
    deine Tips sind genial.


    Hallo ~blaze~
    frohes neues !
    Ich habe den Fehler gefunden.

    Ich schupse einen neuen Thread an, dieser Thread macht dann die ganze Arbeit.
    - FTP auslesen
    - TreeView mit Nodes bestücken, inkl aller Daten die ich benötige, letzte änderung, größe, .......

    Die Image Liste wird aber im MainThread angelegt und auch bestück.
    Also kann ich aus dem neuen Thread nicht im MainThread die ImageListe bestücken, bearbeiten....
    Nun habe ich versucht aus dem Paralellen Thread auf die ImageListe zu zugreifen, mittels Delegate und Invoke.
    leider lässt sich eine ImageListe nicht Invoken.

    So, nun versuche ich mal die ImageListe im MainThread zu bestücken, vielleicht mit einem BackGroundWorker.
    hier bleibt dann nur zu Testen....
    - der Zeitliche Ablauf.
    - die Zuordnung der Image im TreeView.

    Die TreeView kommt irgendwann aus dem Parallen Thread zurück.
    - wann ?
    - genau danach muss ich das TreeView durchlaufen und die Endungen der Datei Namen vergleichen.

    Mal sehen ob und wie das Möglich ist.

    Nochmals vielen dank für deine Mühe

    Bernd

    Edit by ~blaze~:
    Dreifachpost
    --> *Beiträge zusammengefügt*

    Dieser Beitrag wurde bereits 5 mal editiert, zuletzt von „~blaze~“ ()

    Hey, Bernd!
    Hast du shcon einmal eine PDF mit eigenem Icon gesehen? Also ich nicht, wenn ich eine PDF-Datei habe, dann hat die Datei das Icon von Adobe Reader. Ich würde halt dann immer das Icon nehmen, das der Dateiendung zugewiesen ist.
    Nur bei der .exe wird es schwierig, da die ein eigenes Icon haben kann. Aber da würde ich auch einfach das Standardicon von der .exe-Datei nehmen, wie zum Beispiel WinRAR auch. ;)

    Grüße,
    Xeno
    Müssen ImageLists auch im gleichen Thread gefüttert werden, wie sie erzeugt werden? Und du greifst doch eigentlich im Thread zum ersten mal auf die Imagelist zu oder missverstehe ich da etwas?
    ImageList ist zwar eine Komponente, aber kein Control. Daher erbt es nicht die Invoke-Prozedur. Ansonsten kannst du auch die Invoke-Prozedur des Controls verwenden, da die ImageList und das Control wohl auf dem gleichen Thread erstellt wurden.

    @Xeno: Hast du jemals die Beiträge davor angesehen?

    Gutes neues übrigens ebenfalls ;).

    Gruß
    ~blaze~

    ~blaze~ schrieb:

    Müssen ImageLists auch im gleichen Thread gefüttert werden, wie sie erzeugt werden?

    Ich denke schon!? Ich habe ja aus dem Paralleln Thread versucht (mit deiner Methode), die ImageListe zu bestücken.
    Das war die Zeile in der er nicht mehr zurück kam. Fehlermeldung Thread........
    Die ImageListe wird im MainThread angelegt.

    ~blaze~ schrieb:

    du auch die Invoke-Prozedur des Controls verwenden

    und genau das ist mir Unbekannt.

    wie sieht sowas aus.
    Ich suche mal bei Google oder MSDN. wenn die heute auf haben.
    Übergib' doch der Instanz der Image_Liste_Variabel-Klasse das Control. Du kannst ja die ImageList thread-statisch machen und für das Control eine Liste erzeugen. Das wäre dann ungefähr so:

    VB.NET-Quellcode

    1. <ThreadStatic()> _
    2. Private Shared ilImageList As ImageList
    3. Public Shared ReadOnly Property ImageList As ImageList
    4. Get
    5. If ilImageList Is Nothing Then
    6. ilImageList = New ImageList()
    7. End If
    8. Return ilImageList
    9. End Get
    10. End Property

    VB.NET-Quellcode

    1. Public Class Image_Liste_Variabel
    2. '...
    3. Private ctrlControl As Control
    4. Private ilThreadImageList As ImageList
    5. Public Function GetExtensionIcon(ByVal extension As String) As Integer
    6. extension = extension.ToLowerInvariant()
    7. Dim index As Integer = ilThreadImageList.Images.IndexOfKey(extension)
    8. If index = -1 Then
    9. Dim icon As Icon = GetIcon(extension)
    10. If icon Is Nothing Then
    11. ctrlControl.Invoke(New Action(Of Image)(Sub(Byval arg As Image) ilThreadImageList.Images.Add(extension, arg)), ilThreadImageList.Images(0))
    12. Else
    13. ctrlControl.Invoke(New Action(Of Icon)(Sub(Byval arg As Icon) ilThreadImageList.Images.Add(extension, arg)), icon)
    14. End If
    15. Return ilThreadImageList.Images.Count - 1
    16. Else
    17. Return index
    18. End If
    19. End Function
    20. Public ReadOnly Property ThreadImageList As ImageList
    21. Get
    22. Return ilThreadImageList
    23. End Get
    24. End Property
    25. Public Sub New(ByVal parentControl As Control)
    26. ctrlControl = parentControl
    27. ilThreadImageList = ImageList
    28. End Sub
    29. End Class


    Das ganze ist so gedacht: Du übergibst dem Konstruktor das Control, das die ImageList benötigt. Der Thread, der den Konstruktor aufruft, muss der gleiche sein, wie der, in dem das Control erzeugt wurde (wird aber nicht überprüft, es kommen halt sonst falsche Ergebnisse raus --> das überprüfen überlasse ich mal dir, du kannst aber auch die ilThreadImageList-Variable per Invoke auslesen).
    Der auslesende Thread ruft immer GetExtensionIcon auf. Die Funktion solltest du evtl. noch umbenennen, mir ist nur kein anständiger Name eingefallen. Oder du benennst GetIcon zu LoadIcon oder so um.
    Für jeden Thread wird eine neue ImageList erzeugt (durch das ThreadStaticAttribute-Attribut), das Feld ilImageList gibt also für jeden Thread einen anderen Wert zurück. Im Konstruktor wird die Liste für den aufrufenden Thread in ilThreadImageList abgelegt. Das dient halt dazu, dass GetExtensionIcon auf die Variable zugreifen kann, ohne dass ctrlControl.Invoke aufgerufen werden muss. Bei mir hat das jetzt funktioniert - ist aber auch nur ein lesender Zugriff. In GetExtensionIcon wird halt überprüft, ob ein Icon in der Liste enthalten ist. Wenn nicht, wird eines geladen und anschließend ein Bild hinzugefügt. Wenn das Icon Nothing ist, wird halt das Standardbild mit dem Index 0 hinzugefügt, wenn Icon nicht Nothing ist, wird das Bild hinzugefügt. Dies geschieht per ctrlControl.Invoke.
    Übrigens ist Control.Invoke eine Funktion. D.h. du kannst auch einen Delegaten mit einem Rückgabewert verwenden, um z.B. Werte, Controls in einem anderen Thread zu berechnen/erzeugen usw.

    Gruß
    ~blaze~
    Puh, jetzt gehts los.
    Grade ich wo ich mich noch nicht mit Thread und Delegate, Invoke bschäftigt habe.
    Naja dann halt jetzt.

    In Zeile 12 + 14 (ctrlControl) kommen Fehler
    Der Delegate System.Action erfordert als einziges Argument für seinen Konstruktor einen Adress(Of Ausdruck oder einen Lambda Ausdruck.

    Sagt mir nichts. Wie gesagt... Delaget ist das erste mal.

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

    Ah, in VB 2008 wird der von mir verwendete Lambda-Ausdruck noch nicht unterstützt... (Der Lambda-Ausdruck ist dieses Sub(...)...)

    VB.NET-Quellcode

    1. If icon Is Nothing Then
    2. ctrlControl.Invoke(New Action(Of Image)(Sub(Byval arg As Image) ilThreadImageList.Images.Add(extension, arg)), ilThreadImageList.Images(0))
    3. Else
    4. ctrlControl.Invoke(New Action(Of Icon)(Sub(Byval arg As Icon) ilThreadImageList.Images.Add(extension, arg)), icon)
    5. End If

    wird zu

    VB.NET-Quellcode

    1. If icon Is Nothing Then
    2. ctrlControl.Invoke(New Action(Of String, Image)(AddressOf AddImage), extension, ilThreadImageList.Images(0))
    3. Else
    4. ctrlControl.Invoke(New Action(Of String, Icon)(AddressOf AddIcon), extension, icon)
    5. End If


    mit

    VB.NET-Quellcode

    1. 'Abhaengig vom verwendeten FWs gibt's das schon vordefiniert
    2. Private Delegate Sub Action(Of T1, T2)(ByVal arg1 As T1, ByVal arg2 As T2)

    VB.NET-Quellcode

    1. Private Sub AddImage(ByVal extension As String, image As Image)
    2. ilThreadImageList.Images.Add(extension, image)
    3. End Sub
    4. Private Sub AddIcon(ByVal extension As String, icon As Icon)
    5. ilThreadImageList.Images.Add(extension, icon)
    6. End Sub


    Gruß
    ~blaze~

    ~blaze~ schrieb:

    Übergib' doch der Instanz der Image_Liste_Variabel-Klasse das Control.

    Sorry das ich nicht folgen kann.
    Bisher hatte ich keine ImageListe in meinem Control. Die hatte ich ja in der Klasse Image-Liste-Variabel ausgelagert.
    Das bedeutet ich muss in dem Control (main Thread) auch eine ImageListe haben ?
    Ich glaube du redest hier von etwas anderem als ich vielleicht glaube.
    Welches Control soll ich übergeben ? und wie ?

    Die Sub New steht doch in er Klasse Image-Liste-Variable. Wie und wann kann ich den der Sub New etwas übergeben?

    ~blaze~ schrieb:

    Public Sub New(ByVal parentControl As Control)
    ctrlControl = parentControl
    ilThreadImageList = ImageList
    End Sub
    End Class



    Und so häufen sich Frage und Frage !
    Du siehst ich kann deinem Vorhaben nicht folgen.

    :love: