29 October 2007 .NET, FTP, HowTo Robert Muehsig

Ich mag FTP eigentlich nicht, allerdings kann man es manchmal nicht ändern und muss trotzdem irgendwelche Datein von einem FTP Server über .NET runterladen.

Es ist eigentlich nicht sonderlich schwer eine Datei runterzuladen - hier der Beispielcode (in der Zusammenstellung ungetestet - sollte aber so funktionieren) :

    public static void DownloadFile() 
    { 
        Uri serverUri = new Uri("ftp://example.de/foo.jpg"); 
        FtpWebRequest request = (FtpWebRequest)WebRequest.Create(serverUri); 
        request.Method = WebRequestMethods.Ftp.DownloadFile; 
        request.UseBinary = true; 
        request.Credentials = new NetworkCredential("USER", "PASSWORD"); 

        try 
        { 
            FtpWebResponse response = (FtpWebResponse)request.GetResponse(); 
            Image image = Image.FromStream(response.GetResponseStream()); 
            string path = Path.Combine("C:\\MyImages\\", "Foo.jpg"); 
            FileStream stream = new FileStream(path, FileMode.Create); 

            image.Save(stream,  System.Drawing.Imaging.ImageFormat.Jpeg); 
        } 
        catch (WebException e) 
        { 
            string ex = e.Message; 
        } 

    }
Erklärung: Das .NET Framework kommt mit einer Klasse "FtpWebRequest" daher, welches uns die eigentliche Arbeit abnimmt. Als erstes nehmen wir unsere "URI" und erstellen einen "WebRequest" welchen wir dann zum FtpWebRequest casten. Jetzt kommt die Besonderheit des FTPs - jeder Befehl den man per FTP machen kann, gibt es in den "WebRequestMethodes.Ftp": Dannach den Username & Passwort angeben und schon können wir versuchen, die Verbindung aufzubauen. Der Rest ist eigentlich selbsterklärend: Wir holen uns den Response, dann den Stream, bauen daraus unser Bild und speichern dieses lokal auf unsere Platte. Anmerkungen: Wie in dem Screenshot zu sehen ist, gibt es auch ein ListDirectory - allerdings kann dies zu ungewöhnlichen Ergebnissen führen, wenn ein Proxy dazwischen ist. Denn dann kommt als Antwort des "FtpResponse" eine HTML Seite. Ein Workaround ist nur, dass man direkt die Files vielleicht in ein XML File angibt und diese nacheinander runterlädt - allerdings ist dies dann nicht automatisch. Links: MSDN


Written by Robert Muehsig

Software Developer - from Saxony, Germany - working on primedocs.io. Microsoft MVP & Web Geek.
Other Projects: KnowYourStack.com | ExpensiveMeeting | EinKofferVollerReisen.de