Ordner + Dateien + Unterordner auf eigenen FTP server hochladen?

  • VB.NET

Es gibt 25 Antworten in diesem Thema. Der letzte Beitrag () ist von Kosic.

    Ordner + Dateien + Unterordner auf eigenen FTP server hochladen?

    Hey Leute,


    Wollte fragen ob mir wer sagen kann wie man "Ordner + Dateien + Unterordner" auf eigenen FTP server hochladen kann?
    Hab schon vieles ausprobiert aber nichts hat geklappt -.-
    Wie man einzelne Dateien(wen man den namen kennt) hochladen kann, aber nicht wie man Ordner, Unterordner(wenn man den namen nicht kennt), Dateien(wenn man den namen nicht kennt) hochladen kann.
    Kann mir wer helfen? ?(

    LG Kosic :)

    Edit by ~blaze~:
    *übergroße Schriftart normalisiert*

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

    Hey,

    Das kannst du sehr einfach machen. Mit Getfiles kriegst du alle Dateien im Ordner und die kannst du - wie bereits gesagt - einzeln hochladen. Nutze also eine einfache For-Schleife, My.Computer.Filesystem.Getfiles, und My.Computer.Network.Uploadfile. Downloaden ist da schwieriger, du kannst die Dateien leider nicht so einfach vom Ftp-Server kriegen. Du kannst aber eine Datei beim uploaden schreiben, die alle Dateien auflistet und diese dann wieder downloaden.

    Quelle: Klick mich


    Grüßle Marco
    soooo hab ne lösung gefunden, aber brauch doch nochmal hilfe :thumbsup:
    Code:

    VB.NET-Quellcode

    1. Dim pfad2 As String
    2. pfad2 = Environment.GetFolderPath(Environment.SpecialFolder.MyDocuments)
    3. For Each Folder In My.Computer.FileSystem.GetFiles(pfad2, FileIO.SearchOption.SearchTopLevelOnly)
    4. ListBox1.Items.Add(Folder)
    5. Next


    was kann ich jetz machen, das er jedes einzele item(=pfad) hochlädt?

    Mfg Daniel
    Mal eine Klasse für Download

    VB.NET-Quellcode

    1. Imports System.Net
    2. Imports SuperControl2012.Funktionen
    3. Public Class Download_File_Async
    4. Dim WithEvents Download As New Net.WebClient
    5. Public Sub File_Download_Async(ByVal FTP_Datei As String, ByVal Ziel_Path_Inkl_FileName As String, _
    6. ByVal Benutzername As String, ByVal Passwort As String)
    7. ' WebClient
    8. Download = New Net.WebClient
    9. ' URL mit Zieldatei
    10. Dim url As String = FTP_Datei
    11. ' Anmeldedaten am FTP-Server
    12. Download.Credentials = New Net.NetworkCredential(Benutzername, Passwort)
    13. ' Datei asnychron downloaden
    14. Try
    15. ' Download
    16. Download.DownloadFileAsync(New Uri(url), Ziel_Path_Inkl_FileName)
    17. Catch ex As Exception
    18. End Try
    19. End Sub
    20. Private Sub Download_DownloadFileCompleted(ByVal sender As Object, ByVal e As System.ComponentModel.AsyncCompletedEventArgs) Handles Download.DownloadFileCompleted
    21. ' Hier änderungen im Progress Bar anzeigen.
    22. End Sub
    23. Private Sub Download_DownloadProgressChanged(ByVal sender As Object, ByVal e As System.Net.DownloadProgressChangedEventArgs) Handles Download.DownloadProgressChanged
    24. ' Was anzeigen wenn der Job erledigt ist.
    25. ' Aber vorsicht, das ist eine andere Instanz, also Invoken
    26. End Sub
    27. End Class


    Aufrufen tuste dann so

    VB.NET-Quellcode

    1. ' Der Startaufruf
    2. Public Sub Donwload_Folder_Recursive(ByVal Quelle As String, ByVal Quell_User As String, ByVal Quell_Pass As String, ByVal After_Download_Upload_Folder As Boolean, ByVal Ziel_Path As String, ByVal Ziel_User As String, ByVal Ziel_Pass As String)
    3. ' Ordner ermitteln
    4. Download_Ordner = Extract_LastFolder(Quelle)
    5. ' Temp Ordner anlegen
    6. Dim Ziel_Pfad As String = Download_Temp_Path & Lokal_Path_Separator & Download_Ordner
    7. If Not IO.Directory.Exists(Ziel_Pfad) Then
    8. Try
    9. ' (Environment.CurrentDirectory & "\DownloadFolder_Temp" & \Download_Ordner)
    10. IO.Directory.CreateDirectory(Ziel_Pfad)
    11. Catch ex As Exception
    12. End Try
    13. End If
    14. ' Files auslesen aus FTP Ordner
    15. Download_File_Listing.Clear()
    16. Dim Neue_Liste As FTP_Infos = New FTP_Infos
    17. With Neue_Liste
    18. Download_File_Listing = .Get_File_Listing_From_FTP_Directory(Quelle, Quell_User, Quell_Pass)
    19. End With
    20. If Download_File_Listing.Count > 0 Then
    21. For Each Eintag As String In Download_File_Listing
    22. Dim Ziel As String = Ziel_Pfad & Lokal_Path_Separator & Extrakt_Datei_Name(Eintag, Datei_Pfad.DateiName)
    23. ' MessageBox.Show(Ziel)
    24. Dim Neuer_Download As Download_File_Async = New Download_File_Async
    25. With Neuer_Download
    26. .File_Download_Async(Eintag, Ziel, Quell_User, Quell_Pass)
    27. End With
    28. Next
    29. End If
    30. End Sub


    Meine Kram mit Verzeichnisse und tralala, lässt du einfach weg.

    Edit:
    ist noch nicht Recursive. Also nicht die Bezeichnungen so genau nehmen.
    Das Recursive kommt nach.

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

    Welchen Codeteil blickst du nicht ?

    Den ganzen Code !?. Dann programmiert erstmal kleine Schritte.
    Wie man eine einzelne Datei Up- oder Downloadet.
    Dann kommt du schon dahinter.

    Mach am besten erstmal den Upload. Wenn du das Zielverzeichnis kennst, ist es einfacher als ein Download.
    Weil beim Download musst du ja erst noch die Pfade ermitteln, wenn sie unbekannt sind.
    Wenn sie dort bekannt sind ist es eben so einfach.

    Also wo hapert es genau ?

    Danke
    Bernd

    Edit:
    Mal einen Upload

    VB.NET-Quellcode

    1. Public Sub File_Upload_Async(ByVal FTP_Ziel As String, ByVal Dateiname As String, _
    2. ByVal Benutzername As String, ByVal Passwort As String)
    3. ' Pfad zusammenbauen
    4. Dim FTP_Datei As String = Extrakt_Datei_Name(Dateiname, Datei_Pfad.DateiName)
    5. If FTP_Ziel.EndsWith("..") Then
    6. FTP_Ziel = FTP_Ziel.Replace("..", "")
    7. End If
    8. ' Letzte Slash anfügen
    9. FTP_Ziel = Check_Last_Slash(FTP_Ziel)
    10. ' WebClient
    11. Upload = New Net.WebClient
    12. ' URL mit Zieldatei
    13. Dim url As String = FTP_Ziel & FTP_Datei
    14. ' Anmeldedaten am FTP-Server
    15. Upload.Credentials = New Net.NetworkCredential(Benutzername, Passwort)
    16. ' Datei asnychron uploaden
    17. Try
    18. ' Meldung Vorher
    19. Meldung_Vorher(Dateiname, 500, "upload")
    20. Meldung_Vorher(url, 0, "upload")
    21. ' Upload
    22. Upload.UploadFileAsync(New Uri(url), Dateiname)
    23. Catch ex As Exception
    24. ' Error Meldung
    25. Meldung_Nachher(vbNewLine & "an error was occurred, pleas try again !!!", 0, "Start", False)
    26. ' Meldung_Error(ex)
    27. End Try
    28. End Sub
    29. Private Sub File_Upload_Async_Completed(ByVal sender As Object, ByVal e As System.Net.UploadFileCompletedEventArgs) Handles Upload.UploadFileCompleted
    30. ' Die verbrauchte Zeit bekannt geben
    31. Meldung_Nachher("time to upload file: ", 500, "Start", True)
    32. ' Erledigt Melden
    33. Meldung_Nachher("upload successful: ", 0, "Start", False)
    34. End Sub


    Lass alles mit Meldung weg. Blickste eh nicht. Ist mein Interner kram.

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

    Dachte ich mir.

    Du hast bereits einen Code mit dem du Dateien in einem Verzeichnis durchlaufen kannst.
    Nun brauchst du eine Klasse die deine Datei Asyncron hoch bringt.
    Asyncron deshalb, damit deine Form nicht einfriert und du ewig arten musst.

    Dazu halt die Klasse die Uploadet.
    Die benötigt den Namen (Pfad + Datei) vom FTP_Server. Den Usernamen und das Passwort.
    Und natürlich die Quelle.

    VB.NET-Quellcode

    1. Public Sub File_Upload_Async(ByVal FTP_Ziel As String, ByVal Dateiname As String, _
    2. ByVal Benutzername As String, ByVal Passwort As String)
    3. ' WebClient
    4. Upload = New Net.WebClient
    5. ' URL mit Zieldatei
    6. Dim url As String = FTP_Ziel & "/" & FTP_Datei
    7. ' Anmeldedaten am FTP-Server
    8. Upload.Credentials = New Net.NetworkCredential(Benutzername, Passwort)
    9. ' Datei asnychron uploaden
    10. Try
    11. ' Upload
    12. Upload.UploadFileAsync(New Uri(url), Dateiname)
    13. Catch ex As Exception
    14. End Try
    15. End Sub


    So nun kannst du in deiner Schleife deine Klasse Instanzieren und jede Datei damit runterladen.

    VB.NET-Quellcode

    1. For Each FoundFile As String in .........
    2. Dim NeueInstanz As Klasse = New Klasse
    3. With Klasse
    4. . File_Upload_Async(der kram zum übergeben. File, User, Passwort
    5. End With
    6. Next



    Somit läuft deine Schleife ruck zuck durch und startest für jeden Upload eine neue Instanz , die dir wiederum eine Datei Asyncron Uploadet. Damit hängt dann auch nicht deine Form.

    So nun mach mal einige Experiment und Antworte nicht nach drei Minuten wieder.
    Ich habe um den durchblick zu bekommen und das zu schreiben Tage bebraucht, Und keine Mituten.

    Bischen Eigeninitiative ist manchmal ganz Sinnvoll. Voralem bleibt es dann auch in der Birne drin.


    Bernd
    das blick ich ned ^^:

    VB.NET-Quellcode

    1. ' Pfad zusammenbauen Dim FTP_Datei As String = Extrakt_Datei_Name(Dateiname, Datei_Pfad.DateiName)
    2. If FTP_Ziel.EndsWith("..") Then
    3. FTP_Ziel = FTP_Ziel.Replace("..", "")
    4. End If
    5. ' Letzte Slash anfügen
    6. FTP_Ziel = Check_Last_Slash(FTP_Ziel)



    /Edit: mom ich probier mal noch paar sachen die mir gerade eingefallen sind
    soo hab mich bissi gespielt und bin jetz soweit gekommen...


    Class1

    VB.NET-Quellcode

    1. Public Class Class1
    2. Public Sub File_Upload_Async(ByVal FTP_Ziel As String, ByVal Dateiname As String, ByVal Benutzername As String, ByVal Passwort As String)
    3. Dim Upload As New Net.WebClient
    4. Dim url As String = FTP_Ziel & "/" & Dateiname
    5. FTP_Ziel = "mein ftp server"
    6. Benutzername = "benutzername des ftp"
    7. Passwort = "passwort des ftp"
    8. Upload.Credentials = New Net.NetworkCredential(Benutzername, Passwort)
    9. Try
    10. Upload.UploadFileAsync(New Uri(url), Dateiname)
    11. Catch ex As Exception
    12. End Try
    13. End Sub
    14. End Class



    Form1

    VB.NET-Quellcode

    1. For Each Folder In My.Computer.FileSystem.GetFiles(pfad2, FileIO.SearchOption.SearchTopLevelOnly)
    2. ListBox1.Items.Add(Folder)
    3. Next
    4. For Each FoundFile As String In ListBox1.Items
    5. Dim NeueInstanz As Class1 = New Class1
    6. With ListBox1.Items
    7. Class1.File_Upload_Async(FTP_Ziel, Benutzername, Passwort)
    8. End With
    9. Next


    Need Help ?(

    Daniel

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

    Nicht schlecht. Wenigsten hast du dich mal dran probiert.
    Danke

    So nun mal Schritt für Schritt. Leider aus dem Kopf ohne IDE. Daher können Fehler drin sein.
    Die wirst du dann aber finden. Bzw die IDE.

    Eine Klasse

    VB.NET-Quellcode

    1. Public Class Class1
    2. Public Sub File_Upload_Async(ByVal FTP_Start_Adresse As String, ByVal Dateiname_Datei_Die_Upgeloadet_Werden_Soll As String, ByVal Benutzername As String, ByVal Passwort As String)
    3. ' Das sollte bis hier mal eindeutig sein
    4. ' Neuer WebClient
    5. Dim Upload As New Net.WebClient
    6. ' Die Zeil Adresse zusammen bauen
    7. Dim FTP_Datei As String = Extrakt_Datei_Name(Dateiname_Datei_Die_Upgeloadet_Werden_Sol)
    8. Dim url As String = FTP_Ziel & "/" & FTP_Datei
    9. ' Der Die Das Credential
    10. Upload.Credentials = New Net.NetworkCredential(Benutzername, Passwort)
    11. Try
    12. Upload.UploadFileAsync(New Uri(url), Dateiname_Datei_Die_Upgeloadet_Werden_Sol)
    13. Catch ex As Exception
    14. End Try
    15. End Sub
    16. End Class


    Das war mal nur die Klasse
    Aufrufen dann so:

    VB.NET-Quellcode

    1. For Each FoundFile As String In ListBox1.Items
    2. Dim NeueInstanz As Class1 = New Class1
    3. With NeueInstanz
    4. .File_Upload_Async("FTP_Ziel_Adress", "Found_File", "Benutzername", "Passwort")
    5. End With
    6. Next


    Beim aufrufen übergibst deine Strings , also in etwa so.

    VB.NET-Quellcode

    1. Dim NeueInstanz As Class1 = New Class1
    2. With NeueInstanz
    3. .File_Upload_Async("FTP://Meine_Adresse", Found_File, "Dein Benutzer Name", "Dein Passwort")
    4. End With


    So mal sehen. Das müsstest du nun hinbekommen.

    Ach ne, die Funktion Fehlt noch.
    Die Packst du am besten in die Class1 mit rein

    VB.NET-Quellcode

    1. Public Function Extrakt_Datei_Name(ByVal Pfad As String, ByVal Datei_Pfad As Datei_Pfad) As String
    2. ' Der Return Wert
    3. Dim Return_Value As String = ""
    4. ' Letzte Slash
    5. Dim Letzte_Slash As Integer = 0
    6. ' Datei Name
    7. Dim DateiName As String = ""
    8. ' Pfad Name
    9. Dim PfadName As String = ""
    10. ' FTP oder Lokal
    11. If Pfad.Contains("/") Then
    12. Letzte_Slash = Pfad.LastIndexOf("/") + 1
    13. Else
    14. Letzte_Slash = Pfad.LastIndexOf("\") + 1
    15. End If
    16. ' DateiName oder Pfad
    17. If Datei_Pfad = Funktionen.Datei_Pfad.DateiName Then
    18. Return_Value = Pfad.Substring(Letzte_Slash)
    19. Else
    20. Return_Value = Pfad.Substring(0, Letzte_Slash)
    21. End If
    22. ' Wert der Zrück geht
    23. Return Return_Value
    24. End Function



    jetzt aber
    soo alles schaut jetz super aus, aber "Extrakt_Datei_Name" + () ist bei mir unterwellet

    VB.NET-Quellcode

    1. Dim FTP_Datei As String = Extrakt_Datei_Name(Dateiname)
    2. Dateiname = Form1.ListBox1.SelectedItem

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

    VB.NET-Quellcode

    1. Dim FTP_Datei As String = Extrakt_Datei_Name(Dateiname)Dateiname = Form1.ListBox1.SelectedItem

    geht so nicht.

    Beim aufrufen der Function

    VB.NET-Quellcode

    1. With NeueInstanz
    2. .File_Upload_Async("FTP_Ziel_Adress", "Found_File", "Benutzername", "Passwort")
    3. End With

    wird "Found_File" der Funktion übergeben. Found_File ist ja aus der ListBox der Aktuelle Eintrag.
    Der beinahltet ja den kompletten Pafd. Ich denke mal c:\Test\MeineDatei.txt
    Beim UpLoad brauchst du aber nur den DateiNamen.


    Mir fällt was anderes ein. Lösch die Funktion einfach und ersetzte es durch

    VB.NET-Quellcode

    1. Dim FTP_Datei As String = IO.Path.GetFilename(Found_File)

    Da du eh nur Lokal arbeitest reicht das dann aus.
    ok,
    hab das jetz so gemacht:
    Class1:

    VB.NET-Quellcode

    1. Imports System.IO
    2. Public Class Class1
    3. Public Sub File_Upload_Async(ByVal FTP_Ziel As String, ByVal Dateiname As String, ByVal Benutzername As String, ByVal Passwort As String)
    4. Dim Upload As New Net.WebClient
    5. Dim url As String
    6. Dim FTP_Datei As String = IO.Path.GetFileName(FoundFile) ' (FoundFile) ist unterwellt
    7. url = FTP_Ziel & "/" & FTP_Datei
    8. FTP_Ziel = "ftp server"
    9. Dateiname = Form1.ListBox1.SelectedItem
    10. Benutzername = "benutzername"
    11. Passwort = "pw"
    12. Upload.Credentials = New Net.NetworkCredential(Benutzername, Passwort)
    13. Try
    14. Upload.UploadFileAsync(New Uri(url), Form1.ListBox1.SelectedItem)
    15. Catch ex As Exception
    16. End Try
    17. End Sub
    18. End Class



    Form1:

    VB.NET-Quellcode

    1. Dim pfad2 As String
    2. pfad2 = Environment.GetFolderPath(Environment.SpecialFolder.MyDocuments)
    3. For Each Folder In My.Computer.FileSystem.GetFiles(pfad2, FileIO.SearchOption.SearchTopLevelOnly)
    4. ListBox1.Items.Add(Folder)
    5. Next
    6. For Each FoundFile As String In ListBox1.Items
    7. Dim NeueInstanz As Class1 = New Class1
    8. With NeueInstanz
    9. .File_Upload_Async("ftp server", FoundFile, "benutzer", "pw")
    10. End With
    11. Next