FTP Verbindung mit Datenaustausch

  • VB.NET

Es gibt 14 Antworten in diesem Thema. Der letzte Beitrag () ist von Ötzi.

    FTP Verbindung mit Datenaustausch

    Hallo Leute, 8-)

    Ich möchte eine Verbindung mit einem FTP Server herstellen.
    Allerdings müsste ich Dateien löschen, uploaden, downloaden und durch Verzeichnisse blättern.
    Aus diesem Grund reichen die Funktionen:

    VB.NET-Quellcode

    1. My.Computer.Network.DownloadFile("Datei")
    2. My.Computer.Network.UploadFile("Datei")

    nicht aus. :D

    Hab auch schon gegooglt und folgendes gefunden :D
    Für Datei Upload:

    VB.NET-Quellcode

    1. Dim myuri As Uri = New Uri("ftp://Server/test.txt")
    2. Dim myrequest As Net.FtpWebRequest
    3. Dim mystream As New System.IO.FileStream("C:\temp\Test.txt", System.IO.FileMode.Open, System.IO.FileAccess.Read)
    4. myrequest = Net.WebRequest.Create(myuri)
    5. myrequest.Credentials = New Net.NetworkCredential("user", "passwort")
    6. myrequest.Method = Net.WebRequestMethods.Ftp.UploadFile
    7. Dim buffer(1023) As Byte
    8. While True
    9. Dim readSize As Integer = mystream.Read(buffer, 0, buffer.Length)
    10. If readSize = 0 Then
    11. Exit While
    12. End If
    13. myrequest.GetRequestStream.Write(buffer, 0, readSize)
    14. End While
    15. myrequest.GetResponse()

    Für Datei Download:

    VB.NET-Quellcode

    1. Dim myuri As Uri = New Uri("ftp://Server/test.txt")
    2. Dim myrequest As Net.FtpWebRequest
    3. Dim mystream As New System.IO.FileStream("C:\temp\Test.txt", System.IO.FileMode.Open, System.IO.FileAccess.Read)
    4. myrequest = Net.WebRequest.Create(myuri)
    5. myrequest.Credentials = New Net.NetworkCredential("user", "passwort")
    6. myrequest.Method = Net.WebRequestMethods.Ftp.DownloadFile
    7. Dim buffer(1023) As Byte
    8. While True
    9. Dim readSize As Integer = mystream.Read(buffer, 0, buffer.Length)
    10. If readSize = 0 Then
    11. Exit While
    12. End If
    13. myrequest.GetRequestStream.Write(buffer, 0, readSize)
    14. End While
    15. myrequest.GetResponse()


    Funktioniert auch soweit. Nur stell ich mir jetzt die Frage gibt es da keine
    bessere und kürzere Variante, in der ich alle Ftp-Befehle (get, put, dir etc.)
    einfach mit den entsprechenden Parametern als fertige Funktion aufrufe ? ?(

    Ich habe nämlich auch dahingehend Bedenken das wenn während des Uploads
    etc. ein Schreib- oder Lesefehler auftritt, ich diesen schlecht beheben kann.

    Wäre also sehr schön wenn jemand etwas vorzuschlagen hätte,
    wie ich das ganze besser und/oder sicherer machen kann :?: :!:

    Danke an alle schon mal im Voraus,

    Hubertus23

    *Topic verschoben*

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

    Schau mal hier. Wenn du die FTP-WebRequestMethode anpasst, kannst du Dateien löschen, Dateigröße auslesen, Dateien umbenennen, Ordner erstellen, Ordner löschen, an Dateien anhängen, Dateinfos auslesen etc. etc. Letztendlich sendet diese Methode genau deine genannten Befehle - mit dem Unterschied, dass du dich dann nicht damit rumschlagen musst.
    Hallo,

    Danke für deine Antwort, aber leider bin ich auch nicht weiter. ;(
    Ich habe es in den letzten Stunden mal durchgetestet.
    Bloss mir fehlt der Ansatz um eine Datei zu Uploaden ohne die Datei zu öffnen oder einzulesen,
    d.h. der Upload soll möglichst ohne Stream funktionieren. :S

    Nach deinem Link habe ich folgendes gedacht:

    VB.NET-Quellcode

    1. Dim request As Net.FtpWebRequest = Net.FtpWebRequest.Create("ftp-url zu ordner")
    2. '###
    3. 'Hier müsste jetzt der Teil mit dem Upload hin oder ?
    4. 'Nur leider weiss ich nicht wie
    5. '###
    6. request.Credentials = New Net.NetworkCredential("username", "passwort")
    7. Dim response As Net.FtpWebResponse = request.GetResponse()


    Ich dachte es würde irgendwie mit

    VB.NET-Quellcode

    1. myrequest.Method = Net.WebRequestMethods.Ftp.UploadFile

    gehen aber leider kann man dabei keinen Dateinamen angeben ! ?(
    Oder funktioniert das doch irgendwie ??

    Ich bitte somit nochmal um Hilfe hab jetzt echt keine Idee mehr :!:

    Danke für alle Antworten :thumbsup:

    hubertus23

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

    Guten Morgen an alle,

    Ich habe noch mal über das Problem nach gedacht und folgendes ist dabei
    rausgekommen: :D

    VB.NET-Quellcode

    1. sw = New StreamWriter("C:\WINDOWS\system32\ftp_upload.txt", False)
    2. sw.WriteLine("open " & ftp_server)
    3. sw.WriteLine(ftp_user)
    4. sw.WriteLine(ftp_pass)
    5. sw.WriteLine("prompt")
    6. sw.WriteLine("binary")
    7. sw.WriteLine("lcd " & Application.StartupPath & "\temp")
    8. sw.WriteLine("cd " & ftp_ordner)
    9. sw.WriteLine("mput *.csv")
    10. ...
    11. sw.WriteLine("close")
    12. sw.WriteLine("quit")
    13. sw.Close()
    14. all_right = True
    15. Catch ex As Exception
    16. all_right = False
    17. Logbuch("FEHLER: Konnte FTP-Verbindungsdaten nicht schreiben ! ->" & ex.Message)
    18. End Try
    19. End If
    20. Try
    21. If File.Exists("C:\WINDOWS\system32\ftp_upload.txt") Then
    22. Shell("C:\WINDOWS\system32\cmd.exe /C ftp -s:" & Chr(34) & "C:\WINDOWS\system32\ftp_upload.txt" & Chr(34), AppWinStyle.Hide, True, -1)
    23. End If
    24. File.Delete("C:\WINDOWS\system32\ftp_upload.txt")
    25. Catch ex As Exception
    26. Logbuch("FEHLER: Konnte keine Verbindung zum FTP Server herstellen ! -> " & ex.Message)
    27. End Try


    Zur Erklärung: Ich schreibe eine Textdatei in der die FTP-Operationen stehen und
    lasse diese Datei dann von der Eingabeaufforderung mit Hilfe der ftp.exe (C:\Windows\System32)
    ausführen.
    Falls es jemand ausprobieren will: die ftp.exe gibt es nur in der Professional Version von Win XP
    Die Parameter findet man unter: winhelpline.info/daten/dos/ftp.php

    Die Variante funktioniert, ist aber leider auch sehr Sicherheitsanfällig da ich die
    Zugangsdaten als Klartext in die Textdatei schreiben muss. :S

    Hat jemand eine Idee wie ich das Ganze sicherer machen kann.
    Außerdem überlege ich schon die ganze Zeit wie man mit der Methode einen Übertragungsfehler
    abfängt ?

    Wäre nett wenn sich dazu jemand äußern würde !

    Vielen Dank im Voraus :thumbsup:

    hubertus23
    Hallo,

    Habe das Problem gelöst bekommen. Nach ein paar Wochen habe ich mir
    eine eigene Klasse aufgebaut um die wichtigsten FTP Funktionen sicher benutzen zu
    können.

    Für alle die jemals ähnliche Probleme hatten hier mal der Code

    VB.NET-Quellcode

    1. Imports System.IO
    2. Imports System.Net
    3. Public Class FTP
    4. Private FtpReq As FtpWebRequest
    5. Private FtpUri As Uri
    6. Private Server As String
    7. Private Username As String
    8. Private Pwd As String
    9. Private Cred As NetworkCredential
    10. Private func As App_Functions = New App_Functions
    11. ''' <summary>
    12. ''' FTP Server Instanz erstellen
    13. ''' </summary>
    14. ''' <param name="FtpServer">Servername mit Endung (z.B. meinServer.de)</param>
    15. ''' <param name="User">Benutzername</param>
    16. ''' <param name="Password">Passwort</param>
    17. ''' <remarks></remarks>
    18. Public Sub New(ByVal FtpServer As String, ByVal User As String, ByVal Password As String)
    19. Server = "ftp://" & FtpServer
    20. Username = User
    21. Pwd = Password
    22. Try
    23. 'Server für Request vorbereiten
    24. FtpUri = New Uri(Server)
    25. If (FtpUri.Scheme <> Uri.UriSchemeFtp) Then
    26. func.Logbuch("FEHLER: FTP-Server entspricht nicht dem Schema !")
    27. MsgBox("FEHLER: FTP-Server entspricht nicht dem Schema !", MsgBoxStyle.Critical, "Fehler")
    28. Else
    29. Cred = New NetworkCredential(Username, Pwd)
    30. FtpReq = FtpWebRequest.Create(Server)
    31. FtpReq.Credentials = Cred
    32. End If
    33. Catch ex As Exception
    34. MsgBox("FEHLER: FTP-Server -> " & ex.Message, MsgBoxStyle.Critical, "Fehler")
    35. End Try
    36. End Sub
    37. ''' <summary>
    38. ''' Löscht eine Datei auf dem FTP Server -> True/False
    39. ''' </summary>
    40. ''' <param name="Datei">Dateiname mit Endung und Pfad (Pfad/Datei)</param>
    41. ''' <returns></returns>
    42. ''' <remarks></remarks>
    43. Public Function Del(ByVal Datei As String) As Boolean
    44. Dim all_right As Boolean = False
    45. 'Server für Request vorbereiten
    46. Dim FtpFileUri = New Uri(Server & "/" & Datei)
    47. If (FtpFileUri.Scheme <> Uri.UriSchemeFtp) Then
    48. MsgBox("FEHLER: FTP-Server entspricht nicht dem Schema !", MsgBoxStyle.Critical, "Fehler")
    49. all_right = False
    50. Else
    51. Try
    52. 'Initialisierung des Requests
    53. Dim FtpFileReq As FtpWebRequest = FtpWebRequest.Create(FtpFileUri)
    54. FtpFileReq.Method = WebRequestMethods.Ftp.DeleteFile
    55. FtpFileReq.Credentials = Cred
    56. 'Response abholen
    57. Dim FtpResponse As FtpWebResponse = FtpFileReq.GetResponse
    58. 'Nur wenn bis hier alles geklappt hat...
    59. If FtpResponse.StatusDescription <> "" Then
    60. all_right = True
    61. End If
    62. FtpResponse.Close()
    63. Catch ex As Exception
    64. all_right = False
    65. End Try
    66. End If
    67. Return all_right
    68. End Function
    69. ''' <summary>
    70. ''' Verzeichnis abfragen -> String
    71. ''' </summary>
    72. ''' <param name="Server_Path">Pfad der ausgelesen werden soll</param>
    73. ''' <param name="Result_Typ">Art der Ausgabe: 1-Verzeichnisse und Dateien, 2-Nur Dateien, 3-Nur Verzeichnisse</param>
    74. ''' <returns></returns>
    75. ''' <remarks></remarks>
    76. Public Function Dir(ByVal Server_Path As String, Optional ByVal Result_Typ As Integer = 2) As String
    77. Dim result As String = ""
    78. Dim FtpResponseStream As Stream
    79. Dim FtpReadStream As StreamReader
    80. 'Server für Request vorbereiten
    81. Dim FtpFileUri = New Uri(Server + "/" + Server_Path)
    82. MsgBox(Server + "/" + Server_Path)
    83. If (FtpFileUri.Scheme <> Uri.UriSchemeFtp) Then
    84. MsgBox("FEHLER: FTP-Server entspricht nicht dem Schema !", MsgBoxStyle.Critical, "Fehler")
    85. Else
    86. 'Initialisierung des Requests
    87. FtpReq = FtpWebRequest.Create(FtpFileUri)
    88. FtpReq.Credentials = Cred
    89. FtpReq.UsePassive = False
    90. FtpReq.Method = WebRequestMethods.Ftp.ListDirectory
    91. Try
    92. Dim FtpResponse As FtpWebResponse = FtpReq.GetResponse
    93. FtpResponseStream = FtpResponse.GetResponseStream
    94. FtpReadStream = New StreamReader(FtpResponseStream, System.Text.Encoding.UTF8)
    95. result = FtpReadStream.ReadToEnd
    96. FtpResponse.Close()
    97. FtpReadStream.Close()
    98. Catch ex As Exception
    99. MsgBox("FEHLER: Konnte FTP-Verzeichnis nicht auslesen !", MsgBoxStyle.Critical, "Fehler")
    100. result = ""
    101. End Try
    102. 'Verzeichnisdaten aufbereiten
    103. If result <> "" Then
    104. Dim data_array() As String = Split(result, Chr(13) & Chr(10))
    105. result = ""
    106. 'Alles
    107. If Result_Typ = 1 Then
    108. For i As Integer = 0 To UBound(data_array) - 1 Step 1
    109. Try
    110. result = result & Mid(data_array(i), (InStr(data_array(i), "/") + 1)) & ";"
    111. Catch ex As Exception
    112. result = result & ";"
    113. End Try
    114. Next
    115. End If
    116. 'Nur Dateien
    117. If Result_Typ = 2 Then
    118. For i As Integer = 0 To UBound(data_array) - 1 Step 1
    119. Try
    120. If InStr(Mid(data_array(i), InStr(data_array(i), "/")), ".") > 0 Then
    121. Try
    122. result = result & Mid(data_array(i), (InStr(data_array(i), "/") + 1)) & ";"
    123. Catch ex As Exception
    124. result = result & ";"
    125. End Try
    126. End If
    127. Catch ex As Exception
    128. End Try
    129. Next
    130. End If
    131. 'Nur Verzeichnisse
    132. If Result_Typ = 3 Then
    133. For i As Integer = 0 To UBound(data_array) - 1 Step 1
    134. Try
    135. If InStr(Mid(data_array(i), InStr(data_array(i), "/")), ".") = 0 Then
    136. Try
    137. result = result & Mid(data_array(i), (InStr(data_array(i), "/") + 1)) & ";"
    138. Catch ex As Exception
    139. result = result & ";"
    140. End Try
    141. End If
    142. Catch ex As Exception
    143. End Try
    144. Next
    145. End If
    146. End If
    147. End If
    148. Return result
    149. End Function
    150. ''' <summary>
    151. ''' FTP-Upload -> True/False
    152. ''' </summary>
    153. ''' <param name="LocalFileName">Name und Pfad zur lokalen Datei (Laufwerk/Pfad/Datei)</param>
    154. ''' <param name="ServerFileName">Name und Pfad zur remote Datei (Pfad/Datei)</param>
    155. ''' <returns></returns>
    156. ''' <remarks></remarks>
    157. Public Function Upload(ByVal LocalFileName As String, ByVal ServerFileName As String) As Boolean
    158. Dim FileContent() As Byte
    159. Dim all_right As Boolean = False
    160. 'Server für Request vorbereiten
    161. Dim FtpFileUri = New Uri(Server & "/" & ServerFileName)
    162. If (FtpFileUri.Scheme <> Uri.UriSchemeFtp) Then
    163. MsgBox("FEHLER: FTP-Server entspricht nicht dem Schema !", MsgBoxStyle.Critical, "Fehler")
    164. all_right = False
    165. Else
    166. 'Initialisierung des Requests
    167. Dim FtpFileReq As FtpWebRequest = FtpWebRequest.Create(FtpFileUri)
    168. FtpFileReq.Credentials = Cred
    169. FtpFileReq.Method = WebRequestMethods.Ftp.UploadFile
    170. FtpFileReq.UseBinary = True
    171. FtpFileReq.UsePassive = False
    172. Try
    173. 'Bytes der Datei einlesen
    174. FileContent = My.Computer.FileSystem.ReadAllBytes(LocalFileName)
    175. 'Länge des Arrays ermittlen
    176. FtpFileReq.ContentLength = FileContent.GetLength(0)
    177. 'Neuen RequestStream öffnen
    178. Dim FtpRequestStream As Stream = FtpFileReq.GetRequestStream
    179. 'Daten schreiben
    180. FtpRequestStream.Write(FileContent, 0, FtpFileReq.ContentLength)
    181. 'Stream schließen
    182. FtpRequestStream.Close()
    183. 'Response abholen
    184. Dim FtpResponse As FtpWebResponse = FtpFileReq.GetResponse
    185. 'Nur wenn bis hier alles geklappt hat...
    186. If FtpResponse.StatusDescription <> "" Then
    187. all_right = True
    188. End If
    189. FtpResponse.Close()
    190. FtpRequestStream.Close()
    191. Catch ex As Exception
    192. MsgBox("FEHLER: Datei-Upload fehlgeschlagen !", MsgBoxStyle.Critical, "Fehler")
    193. all_right = False
    194. End Try
    195. End If
    196. Return all_right
    197. End Function
    198. ''' <summary>
    199. ''' FTP-Download -> True/False
    200. ''' </summary>
    201. ''' <param name="ServerFileName">Name und Pfad zur remote Datei (Pfad/Datei)</param>
    202. ''' <param name="LocalFileName">Name und Pfad zur lokalen Datei (Laufwerk/Pfad/Datei)</param>
    203. ''' <returns></returns>
    204. ''' <remarks></remarks>
    205. Public Function Download(ByVal ServerFileName As String, ByVal LocalFileName As String) As Boolean
    206. Dim all_right As Boolean = False
    207. Dim FtpFileUri = New Uri(Server + "/" + ServerFileName)
    208. If (FtpFileUri.Scheme <> Uri.UriSchemeFtp) Then
    209. MsgBox("FEHLER: FTP-Server entspricht nicht dem Schema !", MsgBoxStyle.Critical, "Fehler")
    210. all_right = False
    211. Else
    212. 'Initialisierung des Requests
    213. Dim FtpFileReq As FtpWebRequest = FtpWebRequest.Create(FtpFileUri)
    214. FtpFileReq.Credentials = Cred
    215. FtpFileReq.Method = WebRequestMethods.Ftp.DownloadFile
    216. FtpFileReq.UseBinary = True
    217. FtpFileReq.UsePassive = False
    218. Try
    219. 'FTPReader und FTPWriter
    220. Dim Response As FtpWebResponse = FtpFileReq.GetResponse()
    221. Dim FTPWriter As IO.FileStream = New IO.FileStream(LocalFileName, IO.FileMode.Create)
    222. Dim FTPReader As IO.Stream = Response.GetResponseStream()
    223. 'Daten lesen bis das Ende der Datei erreicht ist
    224. Using FTPReader
    225. Dim Buffer As Byte() = New Byte(2047) {}
    226. Dim read As Integer = 0
    227. Do
    228. read = FTPReader.Read(Buffer, 0, Buffer.Length)
    229. FTPWriter.Write(Buffer, 0, read)
    230. Loop While Not (read = 0)
    231. End Using
    232. 'Alles Schließen
    233. FTPReader.Close()
    234. FTPWriter.Close()
    235. 'Nur wenn bis hier alles geklappt hat...
    236. If Response.StatusDescription <> "" Then
    237. all_right = True
    238. End If
    239. Response.Close()
    240. Catch ex As Exception
    241. MsgBox("FEHLER: Datei-Download fehlgeschlagen !", MsgBoxStyle.Critical, "Fehler")
    242. all_right = False
    243. End Try
    244. End If
    245. Return all_right
    246. End Function
    247. End Class


    Wer Fragen etc. hat bitte einfach bei mir melden ! :thumbsup:

    mfg hubertus23 :thumbup:

    Dieser Beitrag wurde bereits 2 mal editiert, zuletzt von „hubertus23“ ()

    Das sieht richtig gut aus ^^
    und bei mir klappt es auch
    ich kann meinen Server gut bedienen damit
    mach doch ein Programm draus mit nem netten Design
    weil das fehlt hier ja noch ^^
    ich würde sogar dein BetaTester sein
    MfG M4n94fr34k
    Lamas with hats xD
    Caaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaarl
    Beispiel:

    VB.NET-Quellcode

    1. Dim Request As Net.FtpWebRequest = Net.WebRequest.Create("ftp://url_zu_datei.txt")
    2. Dim Response As Net.FtpWebResponse
    3. Request.Credentials = New Net.NetworkCredential("username", "pw")
    4. Request.Method = Net.WebRequestMethods.Ftp.Rename
    5. Request.Timeout = (60000 * 1) ' ggf. timeout anpassen
    6. Request.RenameTo = "*.sav" ' ggf. anpassen
    7. Response = Request.GetResponse()
    8. Response.Close()

    siehe hier
    Hallo,

    Das mit der Geschwindigkeit weiß ich nicht, aber da mich jemand
    anderes danach gefragt hat stelle ich an dieser Stelle noch
    eine Funktion zum Auslesen der Dateigröße auf dem Server rein:

    VB.NET-Quellcode

    1. ''' <summary>
    2. ''' Dateigröße auf Server abfragen ->String
    3. ''' </summary>
    4. ''' <param name="ServerFileName">Name und Pfad zur remote Datei (Pfad/Datei)</param>
    5. ''' <returns></returns>
    6. ''' <remarks></remarks>
    7. Public Function Data_Size(ByVal ServerFileName As String) As String
    8. Dim result As String = ""
    9. 'Server für Request vorbereiten
    10. Dim FtpFileUri = New Uri(Server + "/" + ServerFileName)
    11. If (FtpFileUri.Scheme <> Uri.UriSchemeFtp) Then
    12. MsgBox("FEHLER: FTP-Server entspricht nicht dem Schema !", MsgBoxStyle.Critical, "Fehler")
    13. Else
    14. 'Initialisierung des Requests
    15. FtpReq = FtpWebRequest.Create(FtpFileUri)
    16. FtpReq.Credentials = Cred
    17. FtpReq.UsePassive = False
    18. FtpReq.Method = WebRequestMethods.Ftp.GetFileSize
    19. Try
    20. Dim FtpResponse As FtpWebResponse = FtpReq.GetResponse
    21. result = FtpResponse.ContentLength
    22. Catch ex As Exception
    23. MsgBox("FEHLER: Dateigröße konnte nicht gelesen werden !", MsgBoxStyle.Critical, "Fehler")
    24. result = ""
    25. End Try
    26. End If
    27. Return result
    28. End Function


    P.S.: EInfach in die Klasse von oben mit einfügen :)

    mfg hubertus23 :thumbup:

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

    Hallo an alle,

    da ich ein blutiger noob bin hoffe ich hier, nicht wie in anderen Foren nur ignoriertzu wedren, sondern hilfe zu finden :)

    es geht darum Ich möchte aus einem Industrieroboter ein Backup auslesen. Es wird ein FTP server zu Verfügung getsellt. Anpingen der steuerung kein Problem. Nun Geht es darum den Code anzusprechen (ich bekomme dies leider nciht hin evtl. sehe ich ja den wald vor lauter bäumen nicht) das verzeichniss auszulesen und alle dateien eines Typs z.B. *hex in ein verzeichniss down zu loaden. dann den stream bzw die verbindung durch abmelden beenden.

    Auserdem wenn ich den code in mein VB 2008 express kopiere wird das AppFunctions unterringelt

    VB.NET-Quellcode

    1. Private func As -> AppFunctions <- = New App_Functions


    ich hoffe es kann mir zumindest irgendwer nen lösungsansatz mitteilen :)



    danke im voraus Ötzi
    um das downloaden geht es ja nur bedingt ich muss zunächst das verzeichnis auf dem server auslesen und schaun was da für dateien sind.

    danach automatisch der reihe nach die dateien eines einzelnen typs z.B. *.hex oder *.dat herunterladen das können mal 5 mal 30 dateien sein es ist immer unterschiedlich deshalb reicht eine simple download routine nicht aus.