FTP ganze Verzeichnisse runterladen

  • VB.NET

Es gibt 3 Antworten in diesem Thema. Der letzte Beitrag () ist von Basis2.

    FTP ganze Verzeichnisse runterladen

    Hallo,
    ich bin gerade dabei ein Programm zu schreiben, was alle 3 Tage einen kompletten Backup von einem FTP-Server mit allen Unterverzeichnissen und Dateien erstellt.
    Nun gibt es natürlich das Problem, das FTP es nicht unterstützt, ganze Verzeichnisse runterzuladen. Ich habe auch schon die letzte Woche damit verbracht im Internet danach zu suchen und habe eigene Codes zusammengestückelt. Ich habe auch mehrmals damit angefangen, den Code neu zu schreiben und das hier ist mir bisher am besten gelungen(er ist sehr durcheinander gewürfelt da dort sehr viele "Experimente" stattfanden):
    Spoiler anzeigen

    VB.NET-Quellcode

    1. Imports System.Net
    2. Imports System.Web
    3. Imports System.IO
    4. Public Const ftplink As String = "ftp://ftp.host.tld/" 'der link zum FTP-Server
    5. Dim all As New ArrayList 'Auflistung aller Dateien in einem Verzeichnis
    6. Dim verz As New ArrayList ' Auflistung aller Verzeichnisse in einem Verzeichnis
    7. Dim files As New ArrayList ' Auflistung aller Dateien in einem Verzeichnis
    8. Dim fortschr As New ArrayList ' Auflistung aller bereits gedownloadeten Dateien
    9. Dim verzfortschr As New ArrayList ' Auflistung aller Verzeichnisse, in denen schon alles heruntergeladen ist (natürlich alle Dateien + NUR 1 Verzeichnis)
    10. Dim akturl As String = ftplink ' Der Aktuelle Pfad, wo dateien heruntergeladen werden bzw. wo in den Verzeichnissen nachgeckut wird, und dementschprechend mit dem unterverzeichnis verlängert wird
    11. Dim gonewverz As Boolean = False ' wenn dies "true" ist, bestätigt dies, dass das Verzeichnis, was in "akturl" steht, komplett fertig heruntergeladen ist (aber NUR 1 Verzeichnis) und das es doch in dem
    12. ' vorherigen Pfad nach Verzeichnissen gucken soll, die noch nicht heruntergeladen wurden und diese herunterzuladen. Wenn alle heruntergeladen wurden ist dies wieder
    13. ' "true" und es wird noch ein Verzeichnis davor geschaut.
    14. Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
    15. download_main()
    16. End Sub
    17. Sub list(ByVal URL As String, ByRef alles As ArrayList, ByRef dateien As ArrayList, ByRef verzeichnisse As ArrayList)
    18. alles.Clear()
    19. Dim requ As FtpWebRequest = Nothing
    20. Dim resp As FtpWebResponse = Nothing
    21. Dim reader As StreamReader = Nothing
    22. Try
    23. requ = CType(WebRequest.Create(URL), WebRequest)
    24. requ.Credentials = New NetworkCredential("username", "passwort")
    25. requ.Method = WebRequestMethods.Ftp.ListDirectory
    26. resp = CType(requ.GetResponse(), FtpWebResponse)
    27. reader = New StreamReader(resp.GetResponseStream())
    28. While (reader.Peek() > -1)
    29. alles.Add(reader.ReadLine())
    30. End While
    31. Finally
    32. If reader IsNot Nothing Then reader.Close()
    33. End Try
    34. alles.Remove(".")
    35. alles.Remove("..")
    36. alles.Remove(".ftpquota")
    37. Dim i As Integer
    38. For i = 0 To alles.Count - 1
    39. If alles(i) Like "*.*" Then
    40. dateien.Add(alles(i))
    41. Else
    42. verzeichnisse.Add(alles(i))
    43. End If
    44. Next
    45. End Sub
    46. Sub download_main()
    47. list(akturl, all, files, verz)
    48. download_filesfrompath(akturl, files)
    49. If Not akturl = ftplink Then
    50. Dim comp As Boolean = True
    51. For i = 0 To verz.Count - 1
    52. For Each item In verzfortschr
    53. If Not item = verz(i) Then
    54. comp = False
    55. End If
    56. Next
    57. Next
    58. If comp = True Then
    59. 'aktionen, wenn alles fertig
    60. For i = akturl.Count - 2 To 0 Step -1
    61. If akturl.Chars(i) = "/" Then
    62. akturl.Remove(i + 1)
    63. gonewverz = True
    64. download_main()
    65. Exit Sub
    66. End If
    67. Next
    68. End If
    69. End If
    70. Dim look As Boolean = True
    71. For i = 0 To verz.Count - 1
    72. look = True
    73. For Each item In verzfortschr
    74. If item = verz(i) Then
    75. look = False
    76. End If
    77. Next
    78. If look = True Then
    79. 'aktionen, wenn noch nicht gedownloaded
    80. akturl &= verz(i) & "/"
    81. verzfortschr.Add(verz(i))
    82. download_main()
    83. Exit Sub
    84. End If
    85. Next
    86. End Sub
    87. Sub download_filesfrompath(ByVal FTPverz As String, ByVal files As ArrayList)
    88. Directory.CreateDirectory((Environment.GetFolderPath(Environment.SpecialFolder.Desktop) & "\backup\" & akturl.Replace(ftplink, "")).Replace("/", "\"))
    89. Dim download As Boolean = True
    90. Dim i As Integer = 0
    91. If Not Directory.Exists(Environment.GetFolderPath(Environment.SpecialFolder.Desktop) & "\backup") Then
    92. Directory.CreateDirectory(Environment.GetFolderPath(Environment.SpecialFolder.Desktop) & "\backup")
    93. End If
    94. For i = 0 To files.Count - 1
    95. download = True
    96. For Each item In fortschr
    97. If item = files(i) Then
    98. download = False
    99. End If
    100. Next
    101. If download = True Then
    102. ftpdownload((Environment.GetFolderPath(Environment.SpecialFolder.Desktop) & "\backup\" & akturl.Replace(ftplink, "")).Replace("/", "\") & "\" & files(i), akturl & files(i))
    103. fortschr.Add(files(i))
    104. End If
    105. Next
    106. End Sub
    107. Sub ftpupload(ByVal filepath As String, ByVal uploadlink As String)
    108. Dim client As New WebClient
    109. Dim newuplink As String
    110. newuplink = Replace(uploadlink, " ", "%20")
    111. client.Credentials = New NetworkCredential("username", "passwort")
    112. client.UploadFile(newuplink, filepath)
    113. End Sub
    114. Sub ftpdownload(ByVal filepath As String, ByVal downloadlink As String)
    115. Dim client As New WebClient
    116. client.Credentials = New NetworkCredential("username", "passwort")
    117. client.DownloadFile(downloadlink, filepath)
    118. End Sub

    Doch wenn es anfängt, ein Unterverzeichnis runterzuladen, kommt bei "resp"(FTPWebResponse) in dem Sub "list" in einem Laufzeitfehler die StatusDiscription "550 Can't change directory to Verzeichnis/123/abc: No such file or directory" und die ResponseURI ist "{ftp.host.tld/Verzeichnis/123/abc/}" ?(
    Aber sonst ist in jedem Verzeichnis das erste Verzeichnis + alle Dateien erfolgreich heruntergeladen worden.

    Ich hoffe ihr könnt mir helfen ^^
    Danke schon mal im voraus.
    OK danke für deine Antwort! Hat mir sehr weitergeholfen denn ich habe es jetzt :thumbsup:
    Jetzt habe ich es so gemacht, das in einem Array alle Dateien aufgelistet werden und in einem anderen alle Verzeichnisse. Es wird alles mit dem Direkten link gespeichert!
    Hier ist der Code:
    Spoiler anzeigen

    VB.NET-Quellcode

    1. Imports System.Net
    2. Imports System.Web
    3. Imports System.IO
    4. Public Const ftplink As String = "ftp://ftp.host.tld/"
    5. Dim all As New ArrayList
    6. Dim verz As New ArrayList
    7. Dim files As New ArrayList
    8. Dim allverz As New ArrayList
    9. Dim allfiles As New ArrayList
    10. Dim akturl As String = ftplink
    11. Dim verzcounter As Integer = 0
    12. Sub list(ByVal URL As String, ByRef alles As ArrayList, ByRef dateien As ArrayList, ByRef verzeichnisse As ArrayList)
    13. alles.Clear()
    14. Dim requ As FtpWebRequest = Nothing
    15. Dim resp As FtpWebResponse = Nothing
    16. Dim reader As StreamReader = Nothing
    17. Try
    18. requ = CType(WebRequest.Create(URL), WebRequest)
    19. requ.Credentials = New NetworkCredential("username", "passwort")
    20. requ.Method = WebRequestMethods.Ftp.ListDirectory
    21. resp = CType(requ.GetResponse(), FtpWebResponse)
    22. reader = New StreamReader(resp.GetResponseStream())
    23. While (reader.Peek() > -1)
    24. alles.Add(reader.ReadLine())
    25. End While
    26. Finally
    27. If reader IsNot Nothing Then reader.Close()
    28. End Try
    29. alles.Remove(".")
    30. alles.Remove("..")
    31. alles.Remove(".ftpquota")
    32. Dim i As Integer
    33. For i = 0 To alles.Count - 1
    34. If alles(i) Like "*.*" Then
    35. dateien.Add(alles(i))
    36. Else
    37. verzeichnisse.Add(alles(i))
    38. End If
    39. Next
    40. End Sub
    41. Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
    42. download()
    43. End Sub
    44. Sub download()
    45. list(akturl, all, files, verz)
    46. For Each item In verz
    47. If Not allverz.Contains(akturl & item & "/") Then
    48. allverz.Add(akturl & item & "/")
    49. End If
    50. Next
    51. For Each item In files
    52. If Not allfiles.Contains(akturl & item) Then
    53. allfiles.Add(akturl & item)
    54. End If
    55. Next
    56. verz.Clear()
    57. files.Clear()
    58. If Not verzcounter > allverz.Count - 1 Then
    59. akturl = allverz(verzcounter)
    60. verzcounter += 1
    61. download()
    62. Else
    63. download_files()
    64. End If
    65. End Sub
    66. Sub download_files()
    67. Dim creationpath As String
    68. Dim path As String
    69. For Each item In allverz
    70. creationpath = item.ToString.Replace("/", "\").Remove(0, ftplink.Count)
    71. creationpath = Environment.GetFolderPath(Environment.SpecialFolder.Desktop) & "\backup\" & creationpath
    72. If Not Directory.Exists(creationpath) Then
    73. Directory.CreateDirectory(creationpath)
    74. End If
    75. Next
    76. For Each item In allfiles
    77. path = item.ToString.Replace("/", "\").Remove(0, ftplink.Count)
    78. path = Environment.GetFolderPath(Environment.SpecialFolder.Desktop) & "\backup\" & path
    79. ftpdownload(path, item)
    80. Next
    81. End Sub
    82. Sub ftpdownload(ByVal filepath As String, ByVal downloadlink As String) 'ByVal username As String, ByVal password As String)
    83. Dim client As New WebClient
    84. client.Credentials = New NetworkCredential("username", "passwort")
    85. client.DownloadFile(downloadlink, filepath)
    86. End Sub