FTP Synchronisieren

  • VB.NET

Es gibt 26 Antworten in diesem Thema. Der letzte Beitrag () ist von hal2000.

    FTP Synchronisieren

    Hallo Ihr Spezialisten,

    ich habe ein kleines bzw. größeres Problem. bei dem ich jetzt mal doch die Hilfe von euch benötige.

    Ich habe via VB 2010 ein Programm geschrieben, dass Daten auf einem Server mit einem bestimmten lokalen ordner abgleicht und synchronisiert. Das heist er lädt nur Daten herunter, die lokal entweder älter sind als auf dem Server oder lokal noch garnicht vorhanden sind.
    Um das ganze zu realisieren, habe ich die Chilkat Bibliothek benutzt. Jetzt das Problem. die Chilkat FTP2 *.dll läuft nur 30 tage lang. Danach geht das nicht mehr. Und 149$ für den unlock ist doch etwas viel dafür finde ich.

    Nun habe ich mich auf die Suche gemacht um das ganze anders zu realisieren. Da in VB2010 die WinSock Funtion nicht vorhanden ist, aber dafür System.net.Socket funktioniert dachte ich nimmste eben System.net.Socket. Nun das Problem. VB2010 sagt bei dem FTP Coder dass diverse declarationen wie z.B. DNS(ipentry) veraltet sind. Ich habe versuch das mit IPhostEntry zu ersetzen, das geht aber alles nicht.

    Nun bin ich auf FTPlib bei euch hier gestoßen. Aber wenn ich es richtig verstehe, dann kann man nur download oder upload. Aber sychronisieren nicht direkt. Oder?

    hat denn evtl. jemand einen FTP Code um sich auf einen Server zu verbinden und Daten mit localen Ordern abzugleichen für VB2010?


    Danke schonmal für die Hilfe.

    Gruß Kay

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

    Soetwas kannst du dir doch selber schreiben oder nicht?
    Ist doch ganz einfach die daten von einem ordner mit einem ordner vom ftp abzugleichen bzw zu sync.

    Wie du schon gesagt hast einfach größe und erstellungsdatum etc.. herausfinden und abgleich ... falls neuer dann up bzw downloaden.

    MFG
    GOOGLE ist mein Meister :)
    Ich binmehr oder weniger Anfänger. Ich war schon froh dass ich den Chilkat Code funktionierend hin bekommen habe. Es gibt ja code Beispiele ohne Ende um eine Datei von nem server herunterzuladen und diese lokal zu speichern. Das ist also nicht das Problem. Problem ist eher wie man das ganze als Ordner ausführt.
    Alle Files im Ordner mit for each auslesen. bsp:

    VB.NET-Quellcode

    1. For Each execut In IO.Directory.GetFiles("C:\Ordner", "AIMP2.exe", IO.SearchOption.TopDirectoryOnly)
    2. Next

    FileInfo gibt dir Informationen über das File.
    msdn.microsoft.com/de-de/libra….fileinfo_properties.aspx

    danach einfach vergleichen ob größe etc.. übereinstimmt wenn ja nichts tun und wenn nein down bzw uploaden.
    Für up und download bitte die suche benutzen! gibt genügend beispiele!
    MFG
    GOOGLE ist mein Meister :)

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

    Ich habe jetzt mal die FTP lib von hier getestet. Aber da läuft noch nichmal der Demo Code. Ich bekomme die Meldung:

    FTPLib.appExceptions.InvalidArgumentException wurde nicht behandelt.
    HelpLink=http://www.softwaredesign-solution.de
    Message=Der Pfad hat das falsche Format. Der Pfad muss folgendes Format haben "/.../.../".
    Source=FTPLib
    MethodName=DirectoryExists
    ParamName=vStrRemoteDir
    StackTrace:
    bei FTPLib.FTP.DirectoryExists(String vStrRemoteDir)
    bei FTPLib.FTP.e8WgEGgvq(Object )
    bei System.Threading.ExecutionContext.runTryCode(Object userData)
    bei System.Runtime.CompilerServices.RuntimeHelpers.ExecuteCodeWithGuaranteedCleanup(TryCode code, CleanupCode backoutCode, Object userData)
    bei System.Threading.ExecutionContext.Run(ExecutionContext executionContext, ContextCallback callback, Object state, Boolean ignoreSyncCtx)
    bei System.Threading.ExecutionContext.Run(ExecutionContext executionContext, ContextCallback callback, Object state)
    bei System.Threading.ThreadHelper.ThreadStart(Object obj)
    InnerException:
    Hier mal n Code um Dateien mal miteinander zu vergleichen:

    VB.NET-Quellcode

    1. Imports System.IO
    2. Imports System.Security.Cryptography
    3. Public Class Form1
    4. Private Enum FileCompareStatus
    5. Identical = 0 ' identisch
    6. SizeDifferent = 1 ' Dateigröße verschieden
    7. ContentDifferent = 2 ' Inhalt verschieden
    8. [Error] = 3 ' Fehler
    9. End Enum
    10. ' zwei Dateien miteinander vergleichen
    11. Private Function FileCompare(ByVal sFile1 As String, _
    12. ByVal sFile2 As String) As FileCompareStatus
    13. ' Prüfen, ob beide Dateien auch existieren
    14. If File.Exists(sFile1) AndAlso File.Exists(sFile2) Then
    15. Try
    16. ' zunächst Dateigröße vergleichen
    17. If New FileInfo(sFile1).Length <> New FileInfo(sFile2).Length Then
    18. Return FileCompareStatus.SizeDifferent
    19. Else
    20. ' jetzt Hash-Wert berechnen und vergleichen
    21. Dim oHash As HashAlgorithm = HashAlgorithm.Create
    22. Dim oStream As FileStream
    23. ' Hash-Wert für 1. Datei ermitteln
    24. oStream = New FileStream(sFile1, FileMode.Open)
    25. Dim bHash1() As Byte = oHash.ComputeHash(oStream)
    26. oStream.Close()
    27. ' Hash-Wert für 2. Datei ermitteln
    28. oStream = New FileStream(sFile2, FileMode.Open)
    29. Dim bHash2() As Byte = oHash.ComputeHash(oStream)
    30. oStream.Close()
    31. ' jetzt die beiden Hash Byte-Arrays miteinander vergleichen
    32. If BitConverter.ToString(bHash1) = BitConverter.ToString(bHash2) Then
    33. ' Datei-Inhalt ist identisch
    34. Return FileCompareStatus.Identical
    35. Else
    36. ' Datei-Inhalt unterscheidet sich
    37. Return FileCompareStatus.ContentDifferent
    38. End If
    39. End If
    40. Catch ex As Exception
    41. ' Fehler
    42. Return FileCompareStatus.Error
    43. End Try
    44. Else
    45. Return FileCompareStatus.Error
    46. End If
    47. End Function
    48. Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
    49. ' Hier die beiden Dateien festlegen
    50. Dim sFile1 As String = "C:\Datei1.xml"
    51. Dim sFile2 As String = "C:\Datei2.xml"
    52. Select Case FileCompare(sFile1, sFile2)
    53. Case FileCompareStatus.Identical
    54. lblStatus.Text = "Die Dateien sind identisch!"
    55. Case FileCompareStatus.SizeDifferent
    56. lblStatus.Text = "Die Dateien haben unterschiedliche Dateigrößen!"
    57. Case FileCompareStatus.ContentDifferent
    58. lblStatus.Text = "Die Dateien haben unterschiedlichen Inhalt!"
    59. Case FileCompareStatus.Error
    60. lblStatus.Text = "Fehler beim Dateivergleich!"
    61. End Select
    62. End Sub
    63. End Class

    Was du jetzt noch brauchst ist der Download und upload vom ftp was du zu genüge bei google oder hier im forum findest.

    MFG
    GOOGLE ist mein Meister :)
    Nochmal Danke für die Antwort.
    Ich habe mittlerweiel soviel über das Problem des "download vn Ordner auf einem Server" gelesen, dass ich es wohl nicht so einfach schaffen werde. Die meisten bieten dafür sogar eine extra Library an die man kaufen muss. Im grunde ist es also nicht mal eben so erledigt, denn sonst würden die Leute das nicht verkaufen können.

    Ich Moment habe ich das Projekt der synchronisation auf Eis gelegt. Ich werde das ganze als ZIP File auf dem Server ablegen und dann ganz normal downloaden.

    VB.NET-Quellcode

    1. Imports System.Net
    2. Imports ICSharpCode.SharpZipLib.Core
    3. Imports ICSharpCode.SharpZipLib.Zip
    4. Public Class Form1
    5. Dim WithEvents myWebClient As New WebClient
    6. Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
    7. Me.Text = "Download wird gestartet..."
    8. myWebClient.DownloadFileAsync(New Uri("http://speedtest.netcologne.de/test_10mb.bin"), "c:\TEMP\test_10mb.bin")
    9. End Sub
    10. Private Sub myWebClient_DownloadProgressChanged(ByVal sender As Object, ByVal e As System.Net.DownloadProgressChangedEventArgs) Handles myWebClient.DownloadProgressChanged
    11. Me.Text = e.ProgressPercentage & " %"
    12. ProgressBar1.Value = e.ProgressPercentage
    13. Label1.Text = (e.BytesReceived / 1024).ToString("0.##") & " KB von " & (e.TotalBytesToReceive / 1024).ToString("0.##") & " KB geladen"
    14. End Sub
    15. Private Sub DownloadFileCompleted(ByVal sender As Object, ByVal e As System.ComponentModel.AsyncCompletedEventArgs) Handles myWebClient.DownloadFileCompleted
    16. MsgBox ("Download fertig!")
    17. myWebClient.Dispose()
    18. End Sub
    19. End Class


    Dann möchte ich das Zip File lokal in "MyDocuments" entpacken und das Zip aus dem Temp ordner löschen

    VB.NET-Quellcode

    1. Public Function MyDocsPath() As String
    2. MyDocsPath = Environ$("USERPROFILE") & "\My Documents\"
    3. End Function
    4. Dim dir As String = "c:\TEMP\"
    5. Try
    6. ' Suchen der Datei mit der Endung 'zip'
    7. For Each Dateiname As String In IO.Directory.GetFiles(dir)
    8. If Dateiname.EndsWith("zip") Then
    9. expander.ExtractZip(Dateiname, MyDocsPath, _
    10. "\pfc.pfc")
    11. End If
    12. Next
    13. Catch ex As Exception
    14. MessageBox.Show(ex.Message.ToString)
    15. End Try



    Auf diese Art werde ich es wohl erstmal probieren. Den Code habe ich eben aus meine Versuchen gestern zusammengeschnippselt. Das muss ich noch soweit testen ob das überhaupt geht. Die Theorie sagt zumind: es sollte gehen.

    Nur mit der Zuordnung des "myDocuments" muss ich mal sehen wie man das am bestebn realisiert.
    Wozu jetzt auf eis legen?
    Wenn du jetzt e schon einen angemessen download hast und den code zum vergleichen dann bräuchtest du nur mehr den code zum uploaden auf den ftp.
    Klar kannst du dir auch die LIB's besorgen und die funktionen verwenden die sie anbieten. aber meiner meinung nach ist der eigene code der verständlichere.

    Lass den kopf nicht hängen ;) das schaffst du schon wenn du dich noch n kleines stück mehr bemühst ;)

    FTP Upload:
    [VB 2010] Daten per ftp hochladen
    [VB 2010] Wie kann ich etwas auf FTP-Server hochladen ohne das ich die ftp daten angeben muss?
    [VB 2008] FTP Upload mit Progressbar und Byte Anzeige
    MFG
    GOOGLE ist mein Meister :)

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

    Ich denke an nichts anderes mehr. Upload benötige ich im Grudne nicht.

    Ich scheitere einfach schlichtweg an der Tatsache, "ganze Ordner inkl. Inhalt" herunter zu laden. Das ist etwas wo ich garnicht hin bekomme.

    Die "for each" Schleife ist zwar gut um die Dateien auszulesne die vorhanden sind, aber wie soll ich die einzelnen Daten dann zum download bringen?

    Da bin ich einfach zu "Anfängermäßig" um den Sinn und die Anwendung dahingehend zu verstehen wie ich das "for each" weiter verarbeite. In sofern ist es wohl schlauer kleiner anzufangen. Ich meine im groben und ganzen verstehe ich die Zusammenhänge diverser Dinge. Ich habe auch einen Code der mir den Ordnerinhalt in einem Label anzeigt erstellt gestern. Ich dachte ich kann von da aus jede Datei weiter verarbeiten aber das ist einfach so viel drumm rum, dass ich dafür einfach nicht profigenug bin.

    Im Endeffekt wäre die Zip Variante auch nicht schlecht, da die Größe der zu ladenten Datei viel kleiner wäre. Das wäre ein Vorteil.

    Ich konzentriere mich jetzt mal darauf, dass ich das mal hinbekomme.

    FTP verbinden
    Zip File aus bestimmten Ordner herunterladen in Temp ordner
    Zip file in /my documents/Simbin/ entpacken.
    Zip File im Temp löschen

    Damit wäre ich schon voll zufrieden. Schön wäre den Namen der zip File und das Erstellerdatum in einem textfile festzuhalten und dieses Textfile zu nutzen um den Datenabgleich zu machen ob die Datei auf dem Server neuer oder älter ist.

    Kay Petri schrieb:

    Die "for each" Schleife ist zwar gut um die Dateien auszulesne die vorhanden sind, aber wie soll ich die einzelnen Daten dann zum download bringen?

    und da zwischen, also wenn vorhanden oder nicht, klemmst du eine Routine die das Prüft.

    VB.NET-Quellcode

    1. If Datei Vorhanden und Gleich Then
    2. ' nicht
    3. Else
    4. Datei Runter laden
    5. End If
    6. ' Weiter mit der Prüfung.



    Vom Prinzip einfach noch eine Routine mehr. Dann solltest du am ziel sein.

    Meine Erklärungen. Na ja !?
    Ok nochmal zur kleinen Hilfestellung:
    So liest du dir deine Datein und Ordner von ftp aus:

    VB.NET-Quellcode

    1. Try
    2. Dim request As Net.FtpWebRequest = CType(Net.FtpWebRequest.Create("ftp://deineadresseoderauch.inkl/ordnerwodiefilessind"), Net.FtpWebRequest)
    3. request.Method = Net.WebRequestMethods.Ftp.ListDirectory
    4. request.Credentials = New Net.NetworkCredential("username", "pw")
    5. Dim response As Net.FtpWebResponse = CType(request.GetResponse(), Net.FtpWebResponse)
    6. Using myReader As New IO.StreamReader(response.GetResponseStream())
    7. Do While myReader.EndOfStream = False
    8. MsgBox(myReader.ReadLine())
    9. Loop
    10. End Using
    11. Catch ex As Exception
    12. MsgBox(ex.Message)
    13. End Try


    Die MsgBox liefert dir jetzt in der Do While anweisung alle Dateien und Ordner auf.
    Hast du das richtige file gefunden die adresse einfach in nen String legen und downloaden. wie in deinem bsp.
    Danach vergleichst du diese datei mit der lokalen von dir mit meinen vorherigen geposteten Code.
    So und nun die Logische schlussfolgerung:
    Datei gleich = nichts machen!
    Datei neuer = downloaden und ersetzen!

    Fertig.
    Wenn du es mal bis dahin geschaft hast und dir noch immer steine im weg liegen..melde dich einfach nochmal ;)

    achja hier ein link der dir mit Zippen sehr helfen kann:
    [VB 2010] mehrere Dateien Zippen - ohne Zusatzprogramm

    MFG
    GOOGLE ist mein Meister :)

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

    Hallo,

    jetzt muss ich nochmal fragen.

    Ich habe deinen Code soweit übernommen, allerdings lassse ich mir die Files jetzt in einer Listbox darstellen anstatt in einer MsgBox.

    in der Zeile:

    VB.NET-Quellcode

    1. Catch ex As Exception


    bekomme ich folgende Fehlermeldung:
    Auf das verworfene Objekt kann nicht zugegriffen werden.
    Objektname: "System.Net.Sockets.NetworkStream".

    Hier schonmal der ganze Code:

    VB.NET-Quellcode

    1. 'Notwendige Imports
    2. Option Strict On
    3. Imports System.Net
    4. Imports System.Text
    5. Imports System.IO
    6. Imports System.Security.Cryptography
    7. Imports System.Net.Sockets
    8. 'Public Class
    9. Public Class Form1
    10. 'Set Eigen Documente Folder
    11. Public Function MyDocsPath() As String
    12. MyDocsPath = Environ$("USERPROFILE") & "\My Documents\"
    13. End Function
    14. 'Declarations
    15. Dim nofiles As Integer = 0
    16. Dim gotfiles As String
    17. Dim line As String
    18. Dim myNetworkStream As NetworkStream
    19. 'Button Click Event
    20. Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
    21. Try
    22. 'Webrequest Server Folder und LogIn
    23. Dim request As Net.FtpWebRequest = CType(Net.FtpWebRequest.Create("ftp://xxx/custom_skins_season_1/test/"), Net.FtpWebRequest)
    24. request.Method = Net.WebRequestMethods.Ftp.ListDirectory
    25. request.Credentials = New Net.NetworkCredential("username", "password")
    26. Dim response As Net.FtpWebResponse = CType(request.GetResponse(), Net.FtpWebResponse)
    27. 'darstellen enthaltene Files im Ordner
    28. Using myReader As New IO.StreamReader(response.GetResponseStream())
    29. Do While myReader.EndOfStream = False
    30. ListBox1.Items.Add(myReader.ReadLine())
    31. line = myReader.ReadLine
    32. Call checkexistfiles() 'Check ob files im Ordner enthalten
    33. Loop
    34. End Using
    35. Catch ex As Exception
    36. MsgBox(ex.Message)
    37. End Try
    38. End Sub
    39. Private Sub checkexistfiles()
    40. If Not line = "" Then
    41. Dim l As String = line.Replace("/custom_skins_season_1/test/", "")
    42. nofiles = 1
    43. Else
    44. nofiles = 0
    45. End If
    46. If nofiles = 1 Then
    47. My.Computer.Network.DownloadFile("http:/www.sync.gtr-evo.de/custom_skins_season_1/test/" & gotfiles, "C:/Test/" & gotfiles)
    48. End If
    49. End Sub
    50. End Class


    Wenn ich es richtig verstehe, dann ist die Verbindung zum Server und somit zur Datei nach dem Auslesen und wiedergeben in der ListBox unterbrochen.

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

    @Singu
    hey, ein Open-Source-Tut. Das währe mal was.

    Somit könnten alle Interessenten dort mitmachen.
    Also ähnlich wie in der Schule.
    Einer gibt den Ton an und die anderen erarbeiten das Projekt.
    Zum Schluss kommt dann ein schönes TUU für jedermann raus.
    Für mich persönlich bestünde sicher Interesse.

    Aber ich bin auch sehr Dankbar wenn ich das ganze in der Einzelschrittprozedur lerne, denn dann versteht man das erst richtig. Bady unterstützt mich ja super damit auch ich das verstehe.

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

    @Singu
    Nein, deine FTPLib soll dir bleiben. Das währe zuviel des guten.

    Aber vielleicht findet sich jemand der das hier mal durchzieht.
    Gerade bei FTP häufen sich die Fragen.

    Ich könnte das Thema nicht moderieren weil,
    - LRS
    - ich habe mich mit FTP noch nicht wirklich auseinander gesetzt

    Aber vielleicht findet sich jemand.

    @ Kay
    Sorry, wollte mich nicht einmischen.
    Zurück zu deinem thema.

    singu schrieb:

    Wir können auch ein Tutorial zusammen schreiben. Mit FTP habe ich mich in den letzten Jahren sehr viel beschäftigt.

    Genau so war es auch gemeint.

    Wie gesagt. LRS. und dann habe ich halt Probleme mit dem erklären.

    Aber genau du währst ja der Richtige.

    Fang an, ich bin dabei.
    Kannst mit meiner Unterstützung rechnen.

    Danke Kay, für deine Geduld