FTP-Synchronisieren

  • VB.NET

Es gibt 42 Antworten in diesem Thema. Der letzte Beitrag () ist von ErfinderDesRades.

    FTP-Synchronisieren

    Moin Moin Zusammen,

    es ist mal wieder so weit :)
    Ich habe mir gestern mal wieder den Kopf zerbrochen und habe mir folgendes vorgenommen, wo ich gerne Eure Ratschläge, Tipps, Tricks und sonstiges Wissen bräuchte...
    Da ich gerne mal ne Runde Daddel (CounterStrike:Source) habe ich auch einen eigenen Server ;)
    Ab und an lade ich gern mal ne Custom-Map auf die Kiste hoch und hab dann immer das Problem, das ich die auch auf dem FastDownload-Server bereit stellen muss :(
    Also, ab ans Zeichenbrett, was muss nun wieder wo hin kopiert werden welche Dateien brauch ich und und und und... Eine abendfüllende Beschäfftigung :S

    Mein Vorhaben,...:

    So soll es aussehen,...
    Ich habe einen FTP Zugang zum Gameserver, einen FTP Zugang zum FastDL-Server...
    Ich möchte beide FTP Daten eingeben, die Verbindung testen, im jeweils unteren TreeView den Ordner wählen wo die Quelldateien liegen und dann auf Synchronisieren klicken...
    Damit sollen dann alle benötigten Dateien (Verzeichnisse, Unterverzeichnisse und Dateien) zuerst auf ein temporäres Verzeichnis auf die Festplatte geladen werden und direkt im Anschluss auf den Zielserver in das dort ausgewählte Verzeichnis.
    Sowas wie eine Progressbar etc... Ist zwar ein lustiges Gimmik aber muss nicht unbedingt sein...

    Da die Verzeichnisstruktur eines Gameservers so aussieht, würde ich die notwendigen Ordner "fest" (in einem Optionsmenü) hinterlegen,...
    Beispiel:
    /cstrike/ muss ausgewählt werden da hier die Ordner
    > maps
    > models
    > sounds
    > ...
    erwartet werden.

    Ich würde es als Tool zur "Spaßfaktorvergrößerung" und schnellerem Einrichten gerne dann auch öffentlich bereitstellen...
    Da ich hier im Forum nun einige Threads gelesen habe aber leider nicht meinen "Ansatz" gefunden habe, würde ich Euch gerne um Hilfe bitten...
    Nennen wir es, ein Gemeinnütziges Projekt für die Allgemeinheit und Zockerriege ;)

    Grüße und schon mal vielen vielen vielen Dank!
    Stefan
    Nein! Doch! OHH!
    Synchronisieren bedeutet, dass der Zielordner hinterher dieselben Dateien und Unterordner enthält wie der Quell-Ordner, und keine mehr?
    Nu gibts aber gleich mehrere Ordner gleichzeitig zu synchronisieren - das ist schon als Darstellung in Treeviews garnet so ohne.

    Kannst dir mal Sync angugge, wie ich das da gemacht hab: [OpenSource] Sync - Tool für Dateisystem-Backups und -Synchronisierungen
    @ErfinderDesRades sieht auf den ersten Blick interessant aus...
    Jedoch müsste das ganze per FTP Funktionieren.
    Aktuell kämpfe ich noch mit dem TreeView beim FTP. Er gibt mir zwar schon was aus, jedoch befürchte ich, das ich falsch ansetze...

    Hier mal mein Codefragment der Funktion Quelle Listen

    VB.NET-Quellcode

    1. Private Function list_quelle()
    2. Dim fwr As FtpWebRequest = FtpWebRequest.Create("ftp://" & tb_q_server.Text & tb_q_dir.Text)
    3. Try
    4. fwr.Credentials = New NetworkCredential(tb_q_user.Text, tb_q_pass.Text)
    5. fwr.Method = WebRequestMethods.Ftp.ListDirectory
    6. Dim sr As New StreamReader(fwr.GetResponse().GetResponseStream())
    7. Dim str As String = sr.ReadLine()
    8. While Not str Is Nothing
    9. TreeView1.Nodes.Add(str) 'Stattdesen hald mit Treeview. Muss man hald ein bischen den Code ändern
    10. str = sr.ReadLine()
    11. End While
    12. sr.Close()
    13. sr = Nothing
    14. fwr = Nothing
    15. Catch
    16. End Try
    17. End Function


    die Funktion wäre die gleiche für den Zielserver...
    Nein! Doch! OHH!
    @ErfinderDesRades ich hab den Artikel nun durchgelesen und die TryCatch entfernt... Ist sinnig das ganze ;)
    Ich würde dich dennoch gerne einmal um hilfe bitten...
    2 Dinge fehlen mir noch... um für den Anfang schon mal glücklich zu werden :D

    1. Async bei der Funktionsabfrage
    2. Wenn man in der TreeView einen Eintrag anklickt, das der FTP ein Befehl erhält "Weiterzublättern" bzw. in den Ordner springt.
    3. Wäre klasse wenn die TreeView nur Ordner ausgibt und keine Dateien.

    Hier mal der KomplettCode...

    VB.NET-Quellcode

    1. Option Strict On
    2. Imports System.Net
    3. Imports System.IO
    4. Imports Microsoft.Win32
    5. Public Class Form1
    6. Private Function list_quelle(server As String, dir As String, user As String, pass As String) As String
    7. Dim fwr As FtpWebRequest = CType(FtpWebRequest.Create("ftp://" & tb_q_server.Text & tb_q_dir.Text), FtpWebRequest)
    8. fwr.Credentials = New NetworkCredential(tb_q_user.Text, tb_q_pass.Text)
    9. fwr.Method = WebRequestMethods.Ftp.ListDirectory
    10. Dim sr As New StreamReader(fwr.GetResponse().GetResponseStream())
    11. Dim str As String = sr.ReadLine()
    12. While Not str Is Nothing
    13. TreeView1.Nodes.Add(str)
    14. str = sr.ReadLine()
    15. End While
    16. sr.Close()
    17. sr = Nothing
    18. fwr = Nothing
    19. End Function
    20. Private Sub bt_q_test_Click(sender As Object, e As EventArgs) Handles bt_q_test.Click
    21. TreeView1.Nodes.Clear()
    22. list_quelle(tb_q_server.Text, tb_q_dir.Text, tb_q_user.Text, tb_q_pass.Text)
    23. End Sub


    was das Async angeht, habe ich bereits das ganze so getestet...
    Jedoch ohne Erfolg, ich denke ich mach da was falsch...

    VB.NET-Quellcode

    1. Private Function list_quelle(server As String, dir As String, user As String, pass As String) As String
    2. Dim fwr As FtpWebRequest = CType(FtpWebRequest.Create("ftp://" & tb_q_server.Text & tb_q_dir.Text), FtpWebRequest)
    3. fwr.Credentials = New NetworkCredential(tb_q_user.Text, tb_q_pass.Text)
    4. fwr.Method = WebRequestMethods.Ftp.ListDirectory
    5. Dim sr As New StreamReader(fwr.GetResponse().GetResponseStream())
    6. Dim str As String = sr.ReadLine()
    7. While Not str Is Nothing
    8. TreeView1.Nodes.Add(str)
    9. str = sr.ReadLine()
    10. End While
    11. sr.Close()
    12. sr = Nothing
    13. fwr = Nothing
    14. End Function
    15. Private Async Sub bt_q_test_Click(sender As Object, e As EventArgs) Handles bt_q_test.Click
    16. TreeView1.Nodes.Clear()
    17. Await Task.Run(Function() list_quelle(tb_q_server.Text, tb_q_dir.Text, tb_q_user.Text, tb_q_pass.Text))
    18. End Sub
    Nein! Doch! OHH!
    @ErfinderDesRades wird das jetzt ne Lehrstunde für Boardregeln? Die Frage ist doch eindeutig...
    Kompletter Code gepostet... Jeder andere würde darüber schauen und sagen, ja du hast nenn Fehler...
    ICH BRAUCH KEINE LINKS ZU BOARDREGELN!
    Sowas regt mich echt auf...
    Nein! Doch! OHH!

    samson schrieb:

    ICH BRAUCH KEINE LINKS ZU BOARDREGELN!


    Ich denke was der Erfinder dir damit zu sagen versucht:
    Was funktioniert nicht?
    Gibt es eine Fehlermeldung?
    Passiert einfach gar nix oder einfach nur nicht das was du erwartet hast?

    Das wäre für die Lösung hilfreich denn Syntaktisch scheinst du ja nix falsch gemacht zu haben sonst hätte ja bereits der Compiler gemeckert.
    Oder hat vielleicht sogar der Compiler gemeckert? Auch das geht aus deiner Frage nicht hervor.
    There is no CLOUD - just other people's computers

    Q: Why do JAVA developers wear glasses?
    A: Because they can't C#

    Daily prayer:
    "Dear Lord, grand me the strength not to kill any stupid people today and please grant me the ability to punch them in the face over standard TCP/IP."
    ich wollte damit ausdrücken, dass ich weder weiß, was denn nicht funktioniert, noch, ob es eine Exception gibt, wie die ggfs. lautet, und in welcher Zeile sie auftritt.
    Diese Punkte sind alle in dem gegebenen Link aufgeführt, der übrigens mit den Board-Regeln nix zu tun hat.
    Von dir hätte ich eiglich erwartet, du könntest Fragen sinnvoll stellen, zumal ich dich vor nicht allzulang doch schonmal drauf verlinktete, wenn ich mich nicht irre.
    ist mir jetzt so nicht bekannt das ich das schon mal erhalten hatte...

    VB.NET-Quellcode

    1. While Not str Is Nothing
    2. TreeView1.Nodes.Add(str) ' Das wird mir rot dargestellt, Kompilieren somit nicht möglich.
    3. str = sr.ReadLine()
    4. End While


    Das ist mein Async Aufruf...
    Bin mir nicht sicher ob der so korrekt ist, denke jedoch schon... Aber wissen, weiss ich es nicht

    VB.NET-Quellcode

    1. Private Async Sub bt_q_test_Click(sender As Object, e As EventArgs) Handles bt_q_test.Click
    2. TreeView1.Nodes.Clear()
    3. Await Task.Run(Function() list_quelle(tb_q_server.Text, tb_q_dir.Text, tb_q_user.Text, tb_q_pass.Text))
    4. End Sub


    Meine Vermutung liegt darauf, das er aus der While Schleife nichts ausgeben kann. Dadurch rot wird.

    Ich bitte vielmals um entschuldigung, nur mich regt das ganze einfach auf... ich versuch es nun schon seit 5 Stunden, eine warscheinlich Einfach FTP Aufgabe zu erstellen.
    Nein! Doch! OHH!
    System.InvalidOperationException wurde nicht von Benutzercode behandelt.
    HResult=-2146233079
    Message=Der für dieses Steuerelement durchgeführte Vorgang wird vom falschen Thread aufgerufen. Marshallen Sie den richtigen Thread mit Control.Invoke oder Control.BeginInvoke, um den Vorgang auszuführen.
    Source=System.Windows.Forms
    StackTrace:
    bei System.Windows.Forms.TreeNode.Realize(Boolean insertFirst)
    bei System.Windows.Forms.TreeNodeCollection.AddInternal(TreeNode node, Int32 delta)
    bei System.Windows.Forms.TreeNodeCollection.Add(TreeNode node)
    bei System.Windows.Forms.TreeNodeCollection.Add(String text)
    bei FAST_DL_Kopierer_CSS.Form1.list_quelle(String server, String dir, String user, String pass) in F:\VB.Net\FAST-DL_Kopierer_CSS\FAST-DL_Kopierer_CSS\Form1.vb:Zeile 16.
    bei FAST_DL_Kopierer_CSS.Form1._Lambda$__1() in F:\VB.Net\FAST-DL_Kopierer_CSS\FAST-DL_Kopierer_CSS\Form1.vb:Zeile 40.
    bei System.Threading.Tasks.Task`1.InnerInvoke()
    bei System.Threading.Tasks.Task.Execute()
    InnerException:
    Bilder
    • Unbenannt.PNG

      80,13 kB, 910×535, 81 mal angesehen
    Nein! Doch! OHH!

    VB.NET-Quellcode

    1. Dim str As String = sr.ReadLine()
    2. While Not str Is Nothing
    3. TreeView1.Nodes.Add(str)
    4. str = sr.ReadLine()
    5. End While


    du hast eine Endlosschleife
    Dim str As String = sr.ReadLine()
    ist das gleiche wie
    str = sr.ReadLine()

    warum sollte str dann jemals nothing werden
    There is no CLOUD - just other people's computers

    Q: Why do JAVA developers wear glasses?
    A: Because they can't C#

    Daily prayer:
    "Dear Lord, grand me the strength not to kill any stupid people today and please grant me the ability to punch them in the face over standard TCP/IP."
    .Readline ist Nothing, wenn der Stream zuende gelesen ist.

    Den Fehler gibts, wenn du aus einem NebenThread auf ein Control zugreifst - das geht nicht.

    Schreib eine Funktion, die das Ergebnis des Ftp-Abrufes zurückgibt, etwa als List(Of String).
    Die Methode darf auf kein Control zugreifen - ist dasselbe Spiel wie mit dem Datei-Kopier-Kram.

    ErfinderDesRades schrieb:

    .Readline ist Nothing, wenn der Stream zuende gelesen ist.


    Ach stimmt, readline ruft ja immer die nächste Zeile auf.
    There is no CLOUD - just other people's computers

    Q: Why do JAVA developers wear glasses?
    A: Because they can't C#

    Daily prayer:
    "Dear Lord, grand me the strength not to kill any stupid people today and please grant me the ability to punch them in the face over standard TCP/IP."
    Moin Moin zusammen,

    es ist doch nun einiges an Zeit ins Land gegangen und ich muss doch wieder um Hilfe bitten...
    Ich versuche immernoch die Function in Async umzuwandeln, leider ohne Erfolg.

    Anbei mal der komplette Code:

    VB.NET-Quellcode

    1. Option Strict On
    2. Imports System.Net
    3. Imports System.IO
    4. Imports Microsoft.Win32
    5. Public Class Form1
    6. Private Function list_quelle(server As String, dir As String, user As String, pass As String) As String
    7. Dim fwr As FtpWebRequest = CType(FtpWebRequest.Create("ftp://" & tb_q_server.Text & tb_q_dir.Text), FtpWebRequest)
    8. fwr.Credentials = New NetworkCredential(tb_q_user.Text, tb_q_pass.Text)
    9. fwr.Method = WebRequestMethods.Ftp.ListDirectory
    10. Dim sr As New StreamReader(fwr.GetResponse().GetResponseStream())
    11. Dim str As String = sr.ReadLine()
    12. While Not str Is Nothing
    13. TreeView1.Nodes.Add(str)
    14. str = sr.ReadLine()
    15. End While
    16. sr.Close()
    17. sr = Nothing
    18. fwr = Nothing
    19. End Function
    20. Private Sub bt_q_test_Click(sender As Object, e As EventArgs) Handles bt_q_test.Click
    21. TreeView1.Nodes.Clear()
    22. list_quelle(tb_q_server.Text, tb_q_dir.Text, tb_q_user.Text, tb_q_pass.Text)
    23. End Sub
    24. End Class


    Wie würdet Ihr den Code abändern?
    Danke und Grüße,
    samson
    Nein! Doch! OHH!