via FTP oder HTTP alle Dateien im Ordner auflisten + alle Unterordner & vergleichen

  • VB.NET

Es gibt 17 Antworten in diesem Thema. Der letzte Beitrag () ist von viperkill.

    via FTP oder HTTP alle Dateien im Ordner auflisten + alle Unterordner & vergleichen

    Eigentlich wollte ich mich nicht an das bekannte VB Forum wenden, aber ich komme hier seid Tagen nicht weiter.
    Ich versuche alle fuc**ng Dateien aufzulisten die z.B. in diesem Ordner liegen (website.web/resource)
    Das bekomme ich hin. Ich kann die alle in ein List of String packen. Aber nur die Ordner und Dateien die im Ordner "resource" sind.
    Und jetzt immer und immer wieder eine Schleife zu machen wäre zu krass wenn es 15 Unterordner gibt.

    Ich habe es über FTPRequest's versucht. Über HTTPRequest's oder über die FTPLib wo sich die immer beim zählen das App aufgehangen hat.
    Weiß jemand weiter!
    Das ist sehr wichtig für ein anstehendes Projekt!

    P.S. Ich weiß das diese Frage sehr sehr oft hier gestellt wurde, aber allerdings nie richtig gelöst wurde.

    MFG Krischkros!

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

    .. wäre natürlich auch eine Option.

    thefloe hat mir einen kleinen Denkanstoß gegeben..

    Ich solle das über einen rekursiver-algorithmus machen..

    Kann mir jemand weiterhelfen?

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

    Ich hab mich mal damit befasst.

    Hab auf meinem Webspace auch so eine Datei liegen, allerdings ist das nicht rekursiv.

    PHP-Quellcode

    1. function _format_bytes($a_bytes)
    2. {
    3. if ($a_bytes < 1024) {
    4. return $a_bytes .' B';
    5. } elseif ($a_bytes < 1048576) {
    6. return round($a_bytes / 1024, 2) .' KiB';
    7. } elseif ($a_bytes < 1073741824) {
    8. return round($a_bytes / 1048576, 2) . ' MiB';
    9. } elseif ($a_bytes < 1099511627776) {
    10. return round($a_bytes / 1073741824, 2) . ' GiB';
    11. } else {return round($a_bytes / 1099511627776, 2) .' TiB';}
    12. }
    13. foreach (glob('Ordner/*.txt') as $fil)
    14. {
    15. echo pathinfo($fil, PATHINFO_BASENAME) . '|'. _format_bytes(filesize($fil)) . "\n";
    16. }


    Im Php File könntest Du jetzt eine POST Variable erstellen der Du mit Vb die Daten übergibst.
    Im Php File prüfst Du dann noch ob diese Variable einen bestimmten Wert hat, wenn ja dann rufst Du die for each auf.

    Der Visual Basic.Net Teil geht dann mit einer sogenannten NameValuecollection(System.Collections.Specialized) und einem Webclient + .uploadvalues.

    Achte darauf die Methode zu übergeben.

    VB.NET-Quellcode

    1. Dim nv as new namevaluecollection
    2. nv.add("..." , "value")
    3. Dim Wc As New Webclient
    4. Dim B as String() = System.Text.Encoding.Default.GetString(Wc.UploadValues(New Uri("http://blabla.de/datei.php") , "POST" , nv)).Split(Convert.ToChar(10))



    Falls es Dir was nützt..

    Dieser Beitrag wurde bereits 3 mal editiert, zuletzt von „Kevin Hombre“ ()

    Danke. Das wird mir richtig weiterhelfen.
    Ich werde es wie du gerade beschrieben hast versuchen.
    Falls jemand weiß, wie man das ohne PHP machne könnte, könnte natürlich seine Idee posten.

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

    viperkill schrieb:

    Mach eine Funktion die den inhalt des root-Ordners ausliest und jeden gefundenen Ordner in eine liste einträgt. Dann muss die funktion einfach noch diese Liste abarbeiten.
    Er müsste ebenfalls die Dateien die sich im Root Ordner befinden auslesen.
    Rekursiv ist die Vorgehensweise deiner Aussage noch lange nicht,
    denn die gefundenen Ordner die in der Liste sind,
    enthalten ja möglicherweise auch wieder Unterordner und diese Unterordner enthalten wieder Unterordner usw. usw.

    Deine Aussage ist also nicht richtig.
    viperkill:

    hab ich schon längst!

    VB.NET-Quellcode

    1. Dim FileNames As String()
    2. FileNames = Directory.GetFiles(ClientPfad, "*.*", IO.SearchOption.AllDirectories)
    3. For i As Integer = 0 To UBound(FileNames)
    4. RootFiles.Add(FileNames(i))
    5. Next


    mit dem abarbeiten habe ich so meine Probleme!

    Kevin Hombre:

    Du wiederum hast auch recht..
    Naja.
    Man kann es so machen.
    Meiner Meinung nach wäre es besser / am besten direkt alle Dateien mit der Php Datei zurückzugeben.
    Dann musst du nämlich mit Vb nur noch downloaden und keine weiteren Zuweisungen der Dateien in irgendwelche Listen oder Arrays machen.

    Da hab ich denke ich mal nicht genügend Php Kenntnisse für, wobei ich mich mit rekursiver Auflistung in Php noch nicht beschäftigt habe, nur mit der normalen Auflistung.
    Stimmt.
    Ich möchte allerdings die Dateien überprüfen und wenn sie existieren und verschieden sind dann eine Anfrage kommt, ob sie hochgeladen werden soll.
    Das alles bekomme ich hin außer das Überprüfen!

    P.S. Meine PHP Kenntnisse reichen für sowas auch nicht aus, weil ich mit sowas noch die gearbeitet habe, ist aber sehr sehr wichtig für mein anstehendes Projekt.
    hab was vergessen. Die funktion ruft sich für jeden gefundenen ordner selbst noch einmal auf. Somit is sie rekursiv, da diese Order in einem Unterordner auch wieder in die Liste eingetagen werden.

    Hab noch irgendwo nen (sehr) altes projekt wo ich das mal gemacht habe. Wenn du willst kann ichs mal raussuchen aber nicht meckern wenn das "Gurkencode" ist ;D

    EDIT: Die gefundenen Datein kann man dann natürlich auch noch in eine liste schreiben
    Die Methode von viperkill ist wohl am besten, um rauszufinden ob es sich um ein und dieselbe Datei handelt.

    Achja, führt das nicht zu einer Exception wenn man in Php Ordner auflistet und dabei eine Datei als Parameter übergibt?
    Du müsstest noch Unterscheiden ob es sich um Ordner oder Datei handelt oder nicht?
    Wobei das kann man ja anhand der Endung per Contains prüfen, sofern der User keine Ordner hat welche im Namen eine Endung von einem Dateitypen haben.

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

    Krschy schrieb:

    Noch eine kleine Frage nebenbei.
    Das mit der PHP ist wegen der Sicherheit und der Funktion selbst, weil ich jetzt auf Sicherheit nicht achten muss aufgrund das dieses Programm nur für ganz bestimmte Personen ist.


    Jetzt nochmal in korrektem Deutsch bitte.


    Hab das alte Projekt grad gefunden und hier mal der Auszug in dem ein FTP "ausgelesen" wird:

    Spoiler anzeigen


    ACHTUNG SCHLECHTER PROGRAMMIER-STYLE! ;)

    VB.NET-Quellcode

    1. Dim Dir as New List(Of String)
    2. Dim Files as New List(Of String)
    3. Dim request As Net.FtpWebRequest = Net.FtpWebRequest.Create(FTPAdress)
    4. request.KeepAlive = False
    5. request.Method = Net.WebRequestMethods.Ftp.ListDirectoryDetails
    6. request.Credentials = New Net.NetworkCredential(Username, Password)
    7. Dim response As Net.FtpWebResponse = request.GetResponse()
    8. Using myReader As New IO.StreamReader(response.GetResponseStream())
    9. Do While myReader.EndOfStream = False
    10. Dim ReadedString As String = myReader.ReadLine()
    11. If ReadedString.StartsWith("d") Then
    12. ReadedString = ReadedString.Substring(ReadedString.LastIndexOf(" "), ReadedString.Length - ReadedString.LastIndexOf(" "))
    13. ReadedString = ReadedString.Replace(" ", "")
    14. If ReadedString <> "." Then
    15. If ReadedString <> ".." Then
    16. Dir.Add(FTPAdress & "/" & ReadedString)
    17. End If
    18. End If
    19. Else
    20. Dim TmpFileSize As String = ReadedString
    21. ReadedString = ReadedString.Substring(ReadedString.LastIndexOf(" "), ReadedString.Length - ReadedString.LastIndexOf(" "))
    22. ReadedString = ReadedString.Replace(" ", "")
    23. Files.Add(FTPAdress & "/" & ReadedString)
    24. End If
    25. Loop
    26. End Using
    27. For i As Integer = 0 To Dir.Count - 1
    28. Try
    29. Dim DirPath As String = Dir(i).ToString
    30. Dir.Remove(Dir(i).ToString)
    31. GetMainFTPStructure(DirPath, Username, Password)
    32. Catch
    33. End Try
    34. Next
    35. request.Abort()
    36. response.Close()