C#: FTP-Übertragung (Up- und Download) mit Standard .NET-Funktionalität (FtpWebRequest / FtpWebResponse)

Vor kurzem benötigte ich eine einfache Funktion für die Übertragung (Up- und Download) von Dateien via FTP. Bis dahin war mir nicht bewusst, dass das .NET-Framework hierfür schon geeignete Klassen bereitstellt. Dabei handelt es sich um die Klassen FtpWebRequest und FtpWebResponse. In diesem Artikel zeige ich anhand eines kleinen Beispiels wie man mit diesen Klassen einfache FTP-Datenübertragungen realisieren kann.

Die FtpWebRequest-Klasse ermöglicht das programmgesteuerte Interagieren mit FTP-Servern. Um eine Instanz der FtpWebRequest zu erzeugen kann die Create-Methode. Die Create-Methode erwartet als Parameter eine Instanz der Uri-Klasse. Dabei muss man einen gültigen Benutzernamen und ein gültiges Kennwort für den Server angeben, oder der Server muss die anonyme Anmeldung zulassen. Dabei können die Anmeldeinformationen, zum Herstellen der Verbindung mit dem Server, durch Festlegen der Credentials-Eigenschaft angeben werden. Die Anmeldeinformationen können aber auch in den UserInfo-Abschnitt des an die Create-Methode übergebenen URIs eingefügt werden. Wenn die Anmeldeinformationen dort angegeben werden, wird die Credentials-Eigenschaft auf die neuen Netzwerkanmeldeinformationen mit dem angegebenen Benutzernamen und Kennwort festgelegt. Danach benötigt man nur noch den FTP-Befehl, welcher an den Server gesendet werden soll. Dafür wird die Method-Eigenschaft auf einen in der WebRequestMethods.Ftp-Struktur definierten Wert festgelegt. Aktuell werden die folgenden Methoden bereitgestellt:

NameBeschreibung
AppendFileStellt die FTP APPE-Protokollmethode dar, die zum Anfügen einer Datei an eine auf einem FTP-Server vorhandene Datei verwendet wird.
DeleteFileStellt die FTP DELE-Protokollmethode dar, die zum Löschen einer Datei auf einem FTP-Server verwendet wird.
DownloadFileStellt die FTP MTDM-Protokollmethode dar, die zum Abrufen eines DateTime-Zeitstempels von einer Datei auf einem FTP-Server verwendet wird.
GetFileSizeStellt die FTP SIZE-Protokollmethode dar, die zum Abrufen der Größe einer Datei auf einem FTP-Server verwendet wird.
ListDirectoryStellt die FTP NLIST-Protokollmethode dar, die eine kurze Auflistung der Dateien auf einem FTP-Server abruft.
ListDirectoryDetailsStellt die FTP LIST-Protokollmethode dar, die eine ausführliche Auflistung der Dateien auf einem FTP-Server abruft.
MakeDirectoryStellt die FTP MKD-Protokollmethode dar, die ein Verzeichnis auf einem FTP-Server erstellt.
PrintWorkingDirectoryStellt die FTP PWD-Protokollmethode dar, die den Namen des aktuellen Arbeitsverzeichnisses druckt.
RemoveDirectoryStellt die FTP RMD-Protokollmethode dar, die ein Verzeichnis entfernt.
RenameStellt die FTP RENAME-Protokollmethode dar, die ein Verzeichnis umbenennt.
UploadFileStellt die FTP STOR-Protokollmethode dar, die eine Datei auf einen FTP-Server hochlädt.
UploadFileWithUniqueNameStellt die FTP STOU-Protokollmethode dar, die eine Datei mit einem eindeutigen Namen auf einen FTP-Server hochlädt.

So kommen wir auch schon zu entsprechenden Methoden für den Up- und Download von Dateien.

Download einer Datei

Das folgende Code-Snippet zeigt den Download einer Datei mit den Klassen FtpWebRequest und FtpWebResponse:

In den Zeilen 7-9 wird eine FtpWebRequest-Instanz erzeugt, die Anmeldeinformationen angegeben und die FTP-Methode festgelegt. Der Request wird durch Aufruf der GetResponse-Methode an den Server gesendet (Zeile 11). Wenn der angeforderte Vorgang abgeschlossen wurde, wird ein FtpWebResponse-Objekt zurückgegeben. Das FtpWebResponse-Objekt stellt den Status des Vorgangs und ggf. vom Server heruntergeladene Daten bereit. Beim Herunterladen einer Datei von einem FTP-Server ist der Inhalt der angeforderten Datei im Stream des Antwortobjekts verfügbar, sofern der Befehl erfolgreich ausgeführt wurde. Dieser Stream wird mit der GetResponseStream-Methode zurückgeliefert (Zeile 13) und dann mit einem FileStream auf die lokale Festplatte geschrieben (Zeile 18). Alle von der Anforderung zurückgegebenen Daten, z. B. auch die Liste der für eine ListDirectory-Anforderung zurückgegebenen Dateinamen, sind im von der GetResponseStream-Methode zurückgegebenen Stream verfügbar. Die Länge der Streamdaten kann aus der ContentLength-Eigenschaft abgerufen werden.

Upload einer Datei

Das folgende Code-Snippet zeigt den Upload einer Datei mit den Klassen FtpWebRequest und FtpWebResponse:

Bei Verwendung eines FtpWebRequest-Objekts zum Hochladen einer Datei auf einen Server muss der Dateiinhalt in den Anforderungsstream geschrieben werden. Zunächst muss der Stream mit der GetRequestStream-Methode ermittelt werden (Zeile 18). Vor dem Senden des Requests muss die lokale Datei in diesen Stream geschrieben werden (Zeile 33). Ist das erledigt kann der eigentliche Request zum Server gesendet werden (Zeile 40).

Die Klassen FtpWebRequest / FtpWebResponse unterstützen noch weitere Funktionen, wie z.B. das Löschen oder Umbenennen von Dateien, Verzeichnis erstellen, Abrufen der Verzeichnisstruktur, usw. In den unten stehenden Weblinks sind weitere Informationen zu finden.

Literaturverzeichnis und Weblinks

Abk.Quelle
[1]MSDN - FtpWebRequest
FtpWebRequest Klasse
[2]MSDN - FtpWebResponse
FtpWebResponse Klasse
[3]World Wide Web Consortium (W3C) - FILE TRANSFER PROTOCOL (FTP)
FILE TRANSFER PROTOCOL (FTP)
[4]RFC 959 - File Transfer Protocol (FTP)
Fork me on GitHub