Klasse für Filedownload per FTP



  • Hallo Leute,

    ich verwende VS C# 2010 und möchte eine Datei von einem FTP-Server auf die Festplatte herunterladen.

    Die Vorgehensweise ist doch:

    Connect..
    Get()..
    Disconnect

    Welche Klasse verwendet man dazu im VisualStudio?
    Ist die "FtpWebRequest" die einzige möglichkeit, oder gibts es Alternativen?

    Danke



  • Hallo again,

    ja, dies ist die richtige Klasse dafür. Ein komplettes Beispiel dafür gibt es direkt in der MSDN: Technologiebeispiel für FTP-Client

    P.S. In der lokalen Hilfe (zumindestens für VS2008 😉 kannst du das Beispiel direkt als ZIP "downloaden" (suche nach "FTP-Client (Beispiel) [.NET Framework]").
    Ansonsten nutze diesen Link, um alle Technologie-Beispiele herunterzuladen: http://go.microsoft.com/fwlink/?linkid=46902



  • Vielen Dank für die schnelle Antwort.

    Gruß
    sonic



  • Ok, die Funktion aus dem Beispiel sieht so aus:

    public void Download(string downloadUrl)
            {
                // Deklaration lokaler Variablen
                // =============================
                Stream responseStream = null;
                FileStream fileStream = null;
                StreamReader reader = null;
    
                try
                {
                    FtpWebRequest downloadRequest = (FtpWebRequest)WebRequest.Create(downloadUrl);
                    downloadRequest.Credentials = new NetworkCredential("user", "passwort");
                    FtpWebResponse downloadResponse = (FtpWebResponse)downloadRequest.GetResponse();
                    responseStream = downloadResponse.GetResponseStream();
    
                    string fileName = Path.GetFileName(downloadRequest.RequestUri.AbsolutePath);
    
                    if (fileName.Length == 0)
                    {
                        reader = new StreamReader(responseStream);
                        Console.WriteLine(reader.ReadToEnd());
                    }
                    else
                    {
                        fileStream = File.Create(fileName);
                        byte[] buffer = new byte[1024];
                        int bytesRead;
                        while (true)
                        {
                            bytesRead = responseStream.Read(buffer, 0, buffer.Length);
                            if (bytesRead == 0)
                                break;
                            fileStream.Write(buffer, 0, bytesRead);
                        }
    
                        //richTextBox_FileString.Text = fileStream.
                    }
    
                    MessageBox.Show("Download complete.");
    
                }
                catch (UriFormatException ex)
                {
                    MessageBox.Show(ex.Message);
                }
                catch (WebException ex)
                {
                    MessageBox.Show(ex.Message);
                }
                catch (IOException ex)
                {
                    MessageBox.Show(ex.Message);
                }
                finally
                {
                    if (reader != null)
                        reader.Close();
                    else if (responseStream != null)
                        responseStream.Close();
                    if (fileStream != null)
                        fileStream.Close();
                }
    
            }
    

    Nach dem Aufruf der Funktion erscheint die Messagebox mit "Download complete".
    Das scheint zu klappen.
    Aber wie bekomme ich die Daten aus dem "fileStream" in eine Datei auf die Festplatte gespeichert??



  • Du schreibst die Daten schon auf die Platte, der Dateiname steht in 'fileName' (da der relativ ist, könnte die Datei weiss der Himmel wo landen ;D)
    Du liest über den StreamReader aus dem responseStream und schreibst in den fileStream, der die Datei mit Dateiname fileName repräsentiert ("fileStream = File.Create(fileName);")

    Andere Variante:

    WebClient wc=new WebClient();
    wc.Proxy=null;
    wc.Credentials = new NetworkCredential(username, password);
    wc.DownloadFile("ftp://bla.de/blupp/blupp.zip","c:\\heruntergeladen\\blupp.zip");
    


  • Hallo geeky,

    danke für die Antwort.
    Deine Variante sieht sehr übersichtlich aus. Das probiere ich gleich aus.



  • BTW: du könntest Dir mal das using Statement angucken.



  • Was ist ein using Statement?

    P.S. Entschuldigung für die blöden Fragen meinerseits. Ich komme aus der "Borland" Welt 🙂



  • using(var fileStream = new FileStream)
    {
       ...
    }
    

    using baut um Instanzen von Klassen die IDispoable implementieren automatisch einen try-finally -Block in dessen finally -Zweig Dispose() aufgerufen wird. Spart also eine gute Menge (lästige) Tipparbeit.


Anmelden zum Antworten