Einfache FTP Klasse für C#

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;
    }
}