Mit VB.net eine .txt von einem SFTP Server herunterladen, bearbeiten und wieder hochladen.

  • VB.NET

Es gibt 12 Antworten in diesem Thema. Der letzte Beitrag () ist von Jimpo.

    Mit VB.net eine .txt von einem SFTP Server herunterladen, bearbeiten und wieder hochladen.

    Hallo,
    ich würde gerne eine Anwendung schreiben, wo von dem SFTP Server eine .txt heruntergeladen werden soll (in der .txt stehen die ganzen URLs, die blockiert werden sollen). Es soll eine Textbox geben, wo man eine URL, die blockiert werden soll, hineinschreiben kann (mit abfrage, ob die URL in der .txt schon vorhanden ist) und dann wird durch ein klick auf einnen Button die .txt, die heruntergeladen wurde überschrieben. Danach soll diese .txt wieder auf den SFTP Server geladen werden.

    So Sachen, wie einen neuen Text in eine .txt hinzuzufügen oder abzufragen, ob eine bestimmte URL existiert, bekomme ich noch hin. Bei mir scheiterts am herunter-/hochladen der Datei auf den SFTP Server.
    Ich habe schon viele Beiträge dazu gelesen und viel probiert. Leider verstehe ich vieles davon nicht. Einfach nur strg-c + strg-v bringt mich nicht viel weiter.

    Habe auch schon das hier gefunden: My.Computer.Network.DownloadFile("server", "pfad", "user", "password") das ist aber nur für FTP hilfreich.

    Ich freue mich über jede Hilfe ^^

    *Topic verschoben*

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von „Marcus Gräfe“ ()

    Menü Projekt -> unten (Dein Projektname)-Eigenschaften -> Reiter Verweise -> [Hinzufügen]
    oder per Rechtsklick auf das Projekt im Projektexplorer und da im Kontektmenü ganz unten auf Eigenschaften
    Dieser Beitrag wurde bereits 5 mal editiert, zuletzt von „VaporiZed“, mal wieder aus Grammatikgründen.

    Aufgrund spontaner Selbsteintrübung sind all meine Glaskugeln beim Hersteller. Lasst mich daher bitte nicht den Spekulatiusbackmodus wechseln.
    Nun, das Projekt kannst Du runterladen und dann selber kompilieren, sodass Du eine DLL erhältst. Oder Du installierst es als fertiges Paket via Nuget:
    Menü Extras -> Nuget-Paket-Manager -> Nuget-Pakete für Projektmappe verwalten… -> Reiter Durchsuchen, Suche nach SSH.NET -> anwählen, rechts Häkchen setzen, [Installieren] - und warten :rolleyes:
    Dieser Beitrag wurde bereits 5 mal editiert, zuletzt von „VaporiZed“, mal wieder aus Grammatikgründen.

    Aufgrund spontaner Selbsteintrübung sind all meine Glaskugeln beim Hersteller. Lasst mich daher bitte nicht den Spekulatiusbackmodus wechseln.
    Wenn ich auf den Reiter Durchsuchen gehe, kommt folgender Fehler:

    VB.NET-Quellcode

    1. [nuget.org] Fehler beim Abrufen von Metadaten aus der Quelle "https://azuresearch-ussc.nuget.org/query?q=&skip=0&take=26&prerelease=false&supportedFramework=.NETFramework,Version=v4.6.1&semVerLevel=2.0.0".
    2. Fehler beim Senden der Anforderung.
    3. Die zugrunde liegende Verbindung wurde geschlossen: Unerwarteter Fehler beim Senden..
    4. Unerwartetes Dateiende oder 0 Bytes vom Transportstream erhalten.
    5. [nuget.org] Fehler beim Abrufen von Metadaten aus der Quelle "https://azuresearch-ussc.nuget.org/query?q=&skip=0&take=26&prerelease=false&supportedFramework=.NETFramework,Version=v4.6.1&semVerLevel=2.0.0".
    6. Fehler beim Senden der Anforderung.
    7. Die zugrunde liegende Verbindung wurde geschlossen: Unerwarteter Fehler beim Senden..
    8. Unerwartetes Dateiende oder 0 Bytes vom Transportstream erhalten.




    Edit: Habe es mit der dll gemacht und es hat funktioniert! Danke!

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

    Ich habe jetzt bishen herumprobiert und so siehts bisher aus:

    VB.NET-Quellcode

    1. Imports Renci.SshNet.Sftp
    2. Imports Renci.SshNet
    3. Imports System.IO
    4. Public Class Form1
    5. ReadOnly xHost As String = TextBoxHost.Text
    6. ReadOnly xUsername As String = TextBoxUser.Text
    7. ReadOnly xPassword As String = TextBoxPassword.Text
    8. ReadOnly xRemoteDirectory As String = TextBoxRemoteDirectory.Text
    9. Sub Main()
    10. ListFiles()
    11. Console.ReadLine()
    12. Call UploadFile("TextBoxPathSave.Text", "TextBoxPathLoad.Text")
    13. Console.ReadLine()
    14. Call DownloadFile(TextBoxPathLoad.Text, TextBoxPathSave.Text)
    15. Console.ReadLine()
    16. Call RenameFile("Testdatei_123.zip", "Testdatei_456.zip")
    17. Console.ReadLine()
    18. Call DeleteFile("Testdatei_456.zip")
    19. Console.ReadLine()
    20. End
    21. End Sub
    22. Private Sub ListFiles()
    23. Try
    24. Dim sftp As New SftpClient(xHost, 22, xUsername, xPassword)
    25. sftp.Connect()
    26. Dim files = sftp.ListDirectory(xRemoteDirectory)
    27. Console.WriteLine("Dateiname" & vbTab & "Dateilänge" & vbTab & "zuletzt geändert")
    28. For Each file In files
    29. If file.IsDirectory = False Then Console.WriteLine(file.Name & vbTab & file.Length & vbTab & file.LastWriteTime)
    30. Next
    31. sftp.Disconnect()
    32. Catch e As Exception
    33. Console.WriteLine(Err.Description)
    34. Console.ReadLine()
    35. End Try
    36. End Sub
    37. Private Sub UploadFile(UploadFileName As String, RemoteFileName As String)
    38. Try
    39. Dim UploadFileSize As Long = (New FileInfo(UploadFileName)).Length
    40. Console.WriteLine("Starte Upload...")
    41. Using stream As New FileStream(UploadFileName, FileMode.Open)
    42. Using sFTP As New SftpClient(xHost, 22, xUsername, xPassword)
    43. sFTP.Connect()
    44. Dim aSyncr As IAsyncResult = sFTP.BeginUploadFile(stream, xRemoteDirectory & RemoteFileName)
    45. Dim sftpAsyncr As SftpUploadAsyncResult = CType(aSyncr, SftpUploadAsyncResult)
    46. While Not sftpAsyncr.IsCompleted
    47. Dim percent As Integer = CInt((sftpAsyncr.UploadedBytes / UploadFileSize) * 100)
    48. Console.Write(vbCr & "Upload {0}% ", percent)
    49. End While
    50. Console.WriteLine(vbCrLf & "Upload beendet")
    51. sFTP.EndUploadFile(aSyncr)
    52. End Using
    53. End Using
    54. Catch e As Exception
    55. Console.WriteLine(Err.Description)
    56. Console.ReadLine()
    57. End Try
    58. End Sub
    59. Private Sub DownloadFile(RemoteFileName As String, DestFilename As String, Optional RemoteFileSize As Long = 0)
    60. Try
    61. Console.WriteLine("Starte Download...")
    62. Using fStream As New FileStream(DestFilename, FileMode.Create)
    63. Using sFTP As New SftpClient(xHost, 22, xUsername, xPassword)
    64. sFTP.Connect()
    65. Dim aSyncr As IAsyncResult = sFTP.BeginDownloadFile(xRemoteDirectory & RemoteFileName, fStream)
    66. Dim sftpAsyncr As SftpDownloadAsyncResult = CType(aSyncr, SftpDownloadAsyncResult)
    67. While Not sftpAsyncr.IsCompleted
    68. If RemoteFileSize > 0 Then
    69. Dim percent As Integer = CInt((sftpAsyncr.DownloadedBytes / RemoteFileSize) * 100)
    70. Console.Write(vbCr & "Download {0}%", percent)
    71. Else
    72. Console.Write(vbCr & "Download bytes {0}", sftpAsyncr.DownloadedBytes)
    73. End If
    74. End While
    75. Console.WriteLine(vbCrLf & "Download beendet")
    76. sFTP.EndDownloadFile(aSyncr)
    77. fStream.Close()
    78. End Using
    79. End Using
    80. Catch e As Exception
    81. Console.WriteLine(Err.Description)
    82. Console.ReadLine()
    83. End Try
    84. End Sub
    85. Private Sub RenameFile(OldFileName As String, NewFileName As String)
    86. Try
    87. Dim sFTP As New SftpClient(xHost, 22, xUsername, xPassword)
    88. sFTP.Connect()
    89. sFTP.RenameFile(xRemoteDirectory & OldFileName, xRemoteDirectory & NewFileName)
    90. sFTP.Disconnect()
    91. Console.WriteLine("Datei {0} wurde in {1} umbenannt", OldFileName, NewFileName)
    92. Catch e As Exception
    93. Console.WriteLine(Err.Description)
    94. Console.ReadLine()
    95. End Try
    96. End Sub
    97. Private Sub DeleteFile(RemoteFileName As String)
    98. Try
    99. Dim sFTP As New SftpClient(xHost, 22, xUsername, xPassword)
    100. sFTP.Connect()
    101. sFTP.DeleteFile(xRemoteDirectory & RemoteFileName)
    102. sFTP.Disconnect()
    103. Console.WriteLine("Datei {0} wurde gelöscht", RemoteFileName)
    104. Catch e As Exception
    105. Console.WriteLine(Err.Description)
    106. Console.ReadLine()
    107. End Try
    108. End Sub
    109. Private Sub ButtonStart_Click(sender As Object, e As EventArgs) Handles ButtonStart.Click
    110. Main()
    111. End Sub
    112. End Class


    Bevor ich den ganzen Code Analysiere, würde ich gerne zuerst ihn zum laufen bringen.

    Das Problem gerade ist diese Meldung, die nach dem Start des Programms auftaucht: Unbenannt.png

    Z.b FileMode wird aber normal angezeigt, die anderen auch: Unbenannt2.png
    Bilder
    • Unbenannt.png

      6,42 kB, 522×100, 202 mal angesehen
    • Unbenannt2.png

      50,82 kB, 1.093×683, 201 mal angesehen
    Lass Dir von VS helfen. Zeig mit der Maus auf die betroffene Codestelle und klick auf mögliche Korrekturen anzeigen
    Da Du allerdings oben schon Imports System.IO stehen hast, vermute ich, dass der Code in mehreren Dateien ist.
    Bilder
    • Help.png

      21,34 kB, 905×254, 182 mal angesehen
    Dieser Beitrag wurde bereits 5 mal editiert, zuletzt von „VaporiZed“, mal wieder aus Grammatikgründen.

    Aufgrund spontaner Selbsteintrübung sind all meine Glaskugeln beim Hersteller. Lasst mich daher bitte nicht den Spekulatiusbackmodus wechseln.
    Kann man auch irgendwie die Variablen wie xUsername usw auch durch eine Textbox überschreiben?

    Ich habe folgendes probiert:

    VB.NET-Quellcode

    1. xHost = TextBoxHost.Text
    2. xUsername = TextBoxUser.Text
    3. xPassword = TextBoxPassword.Text
    4. xRemoteDirectory = TextBoxRemoteDirectory.Text


    das geht aber nicht, weil es eine ReadOnly variable ist.

    Wozu ist eig. eine ReadOnly Variable gut? Weil ich habe probiert es durch "Dim" zu ersetzen, danach funktioniert aber das Programm nicht mehr ?(
    Richtig cool, es funktioniert! Danke!

    Aber leider hängt sich das Programm immer nach dem ausführen auf, wieso ist das so?

    Edit: Problem gelößt, hatte eine unendliche Schleife drinnen :thumbsup:

    Dieser Beitrag wurde bereits 4 mal editiert, zuletzt von „Jimpo“ ()