Vor kurzem hab ich einen FTP-Datentransfer innerhalb eines C# Programmes benötigt, nach etwas Gehirnschmalzvernichtung ist dieses nichtssagende, undokumentierte Stück Code rausgekommen. Nichts besonderes, keine ausgefuchste Fehlerbehandlung, keine Spezialfunktionen, keine ausführlichen Tests durchlaufen – wozu auch, es läuft ja. 😉
Zur meiner Entschuldigung muss ich auch vorbringen, dass das ja nur der erste Schuss ist – zumindest bevor es produktiv geht, sollten zumindest noch ein paar Fehlerbehandlungsroutinen da reinwachsen.
using System;
using System.Net;
using System.IO;
class FTP {
private string ftpServerIP;
private string ftpUserName;
private string ftpPassWord;
public FTP(string serverIP, string userName, string passWord) {
this.ftpServerIP = serverIP;
this.ftpUserName = userName;
this.ftpPassWord = passWord;
}
public bool Upload(string fileName) {
FileInfo fi = new FileInfo(fileName);
string uri = "ftp://" + ftpServerIP + "/" + fi.Name;
FtpWebRequest ftpRequest = CreateRequest(uri, WebRequestMethods.Ftp.UploadFile);
ftpRequest.ContentLength = fi.Length;
int buffLength = 2048;
byte[] buff = new byte[buffLength];
int count;
bool result = false;
using (FileStream fileStream = fi.OpenRead()) {
Stream ftpStream = ftpRequest.GetRequestStream();
count = fileStream.Read(buff, 0, buffLength);
while (count > 0) {
ftpStream.Write(buff, 0, count);
count = fileStream.Read(buff, 0, buffLength);
}
ftpStream.Close();
fileStream.Close();
result = true;
}
return result;
}
public bool Download(string filePath, string fileName) {
string uri = "ftp://" + ftpServerIP + "/" + fileName;
FtpWebRequest ftpRequest = CreateRequest(uri, WebRequestMethods.Ftp.DownloadFile);
int buffLength = 2048;
int count;
byte[] buff = new byte[buffLength];
bool result = false;
using (FileStream outputStream = new FileStream(filePath + "\\" + fileName, FileMode.Create)) {
FtpWebResponse response = (FtpWebResponse) ftpRequest.GetResponse();
Stream ftpStream = response.GetResponseStream();
count = ftpStream.Read(buff, 0, buffLength);
while (count > 0) {
outputStream.Write(buff, 0, count);
count = ftpStream.Read(buff, 0, buffLength);
}
ftpStream.Close();
response.Close();
outputStream.Close();
result = true;
}
return result;
}
private FtpWebRequest CreateRequest(string uri, string requestMethod) {
FtpWebRequest ftpRequest;
ftpRequest = FtpWebRequest.Create(new Uri(uri)) as FtpWebRequest;
ftpRequest.Credentials = new NetworkCredential(this.ftpUserName, this.ftpPassWord);
ftpRequest.KeepAlive = false;
ftpRequest.Method = requestMethod;
ftpRequest.UseBinary = true;
return ftpRequest;
}
}