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
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.
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):
VB.NET-Quellcode
- Imports System.Net
- Imports System.Web
- Imports System.IO
- Public Const ftplink As String = "ftp://ftp.host.tld/" 'der link zum FTP-Server
- Dim all As New ArrayList 'Auflistung aller Dateien in einem Verzeichnis
- Dim verz As New ArrayList ' Auflistung aller Verzeichnisse in einem Verzeichnis
- Dim files As New ArrayList ' Auflistung aller Dateien in einem Verzeichnis
- Dim fortschr As New ArrayList ' Auflistung aller bereits gedownloadeten Dateien
- Dim verzfortschr As New ArrayList ' Auflistung aller Verzeichnisse, in denen schon alles heruntergeladen ist (natürlich alle Dateien + NUR 1 Verzeichnis)
- 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
- 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
- ' vorherigen Pfad nach Verzeichnissen gucken soll, die noch nicht heruntergeladen wurden und diese herunterzuladen. Wenn alle heruntergeladen wurden ist dies wieder
- ' "true" und es wird noch ein Verzeichnis davor geschaut.
- Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
- download_main()
- End Sub
- Sub list(ByVal URL As String, ByRef alles As ArrayList, ByRef dateien As ArrayList, ByRef verzeichnisse As ArrayList)
- alles.Clear()
- Dim requ As FtpWebRequest = Nothing
- Dim resp As FtpWebResponse = Nothing
- Dim reader As StreamReader = Nothing
- Try
- requ = CType(WebRequest.Create(URL), WebRequest)
- requ.Credentials = New NetworkCredential("username", "passwort")
- requ.Method = WebRequestMethods.Ftp.ListDirectory
- resp = CType(requ.GetResponse(), FtpWebResponse)
- reader = New StreamReader(resp.GetResponseStream())
- While (reader.Peek() > -1)
- alles.Add(reader.ReadLine())
- End While
- Finally
- If reader IsNot Nothing Then reader.Close()
- End Try
- alles.Remove(".")
- alles.Remove("..")
- alles.Remove(".ftpquota")
- Dim i As Integer
- For i = 0 To alles.Count - 1
- If alles(i) Like "*.*" Then
- dateien.Add(alles(i))
- Else
- verzeichnisse.Add(alles(i))
- End If
- Next
- End Sub
- Sub download_main()
- list(akturl, all, files, verz)
- download_filesfrompath(akturl, files)
- If Not akturl = ftplink Then
- Dim comp As Boolean = True
- For i = 0 To verz.Count - 1
- For Each item In verzfortschr
- If Not item = verz(i) Then
- comp = False
- End If
- Next
- Next
- If comp = True Then
- 'aktionen, wenn alles fertig
- For i = akturl.Count - 2 To 0 Step -1
- If akturl.Chars(i) = "/" Then
- akturl.Remove(i + 1)
- gonewverz = True
- download_main()
- Exit Sub
- End If
- Next
- End If
- End If
- Dim look As Boolean = True
- For i = 0 To verz.Count - 1
- look = True
- For Each item In verzfortschr
- If item = verz(i) Then
- look = False
- End If
- Next
- If look = True Then
- 'aktionen, wenn noch nicht gedownloaded
- akturl &= verz(i) & "/"
- verzfortschr.Add(verz(i))
- download_main()
- Exit Sub
- End If
- Next
- End Sub
- Sub download_filesfrompath(ByVal FTPverz As String, ByVal files As ArrayList)
- Directory.CreateDirectory((Environment.GetFolderPath(Environment.SpecialFolder.Desktop) & "\backup\" & akturl.Replace(ftplink, "")).Replace("/", "\"))
- Dim download As Boolean = True
- Dim i As Integer = 0
- If Not Directory.Exists(Environment.GetFolderPath(Environment.SpecialFolder.Desktop) & "\backup") Then
- Directory.CreateDirectory(Environment.GetFolderPath(Environment.SpecialFolder.Desktop) & "\backup")
- End If
- For i = 0 To files.Count - 1
- download = True
- For Each item In fortschr
- If item = files(i) Then
- download = False
- End If
- Next
- If download = True Then
- ftpdownload((Environment.GetFolderPath(Environment.SpecialFolder.Desktop) & "\backup\" & akturl.Replace(ftplink, "")).Replace("/", "\") & "\" & files(i), akturl & files(i))
- fortschr.Add(files(i))
- End If
- Next
- End Sub
- Sub ftpupload(ByVal filepath As String, ByVal uploadlink As String)
- Dim client As New WebClient
- Dim newuplink As String
- newuplink = Replace(uploadlink, " ", "%20")
- client.Credentials = New NetworkCredential("username", "passwort")
- client.UploadFile(newuplink, filepath)
- End Sub
- Sub ftpdownload(ByVal filepath As String, ByVal downloadlink As String)
- Dim client As New WebClient
- client.Credentials = New NetworkCredential("username", "passwort")
- client.DownloadFile(downloadlink, filepath)
- 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.