[C#] Ordner per FTP uploaden / hochladen

Drucken
( 4 Votes )
Hauptkategorie: Programmieren Kategorie: C#
Erstellt am 23.04.2012 Zuletzt aktualisiert am 01.08.2012 Geschrieben von Jonny132
Mit der WebClient - Klasse des .NET-Frameworks steht uns eine einfache Möglichkeit zur Verfügung mit einem (FTP)Server zu kommunizieren.

Diese Klasse stößt aber bei der Interaktion ganzer Ordner schon an ihre Grenzen, weshalb ich euch hier eine Variante zeige in der Ihr ganze Ordner mit Fortschrittsanzeige auf euren FTP-Space hochladen könnt.

Dazu erstellt ihr eine neue Form auf die Ihr eine Progressbar (zur Fortschrittsanzeige) und einen Button (zur Auswahl des zu hochladenden Ordner und starten des Uploadmechanismus) zieht.

Ordner auf einem FTP - Server erstellen (Hilfsfunktion):
    private void CreateFtpDirectory(string requestUriString)
    {
      try
      {
        FtpWebRequest request = (FtpWebRequest)FtpWebRequest.Create(requestUriString);
        request.KeepAlive = false;
        request.Method = WebRequestMethods.Ftp.MakeDirectory;
        request.Proxy = new WebProxy();

        using (FtpWebResponse response = (FtpWebResponse)request.GetResponse())
        {
          if (response.StatusCode != FtpStatusCode.PathnameCreated)
          {
            MessageBox.Show(response.StatusDescription);
          }
        }
      }
      catch (Exception ex)
      {
        MessageBox.Show(ex.Message);
      }
    }
Natürlich brauchen wir die Funktionalität zum erstellen eines Ordners auf dem FTP-Server. Dazu verwenden wir die FtpWebRequest-Klasse in der wir als Mehode (.Method-Eigenschaft) 'MakeDirectory' angeben.
Als Parameter übernimmt diese Funktion eine sogenannte 'Uri', welche Username, Passwort und Host mit dem anzulegenden Ordner enthält. Wie eine solche Uri auszusehen hat seht ihr später im Funktionsaufruf.
Diese ganze Funktion packen wir in einen Try-Catch Block um Fehler abzufangen. Desweiteren überprüfen wir, ob der Statuscode der vom Response (der Antwort vom Server) auch korrekt ist.

Button1 - Click (Starten des Uploadvorgangs):
    private void button1_Click(object sender, EventArgs e)
    {
      FolderBrowserDialog dlg = new FolderBrowserDialog();
      if (dlg.ShowDialog() == System.Windows.Forms.DialogResult.OK)
      {
        DirectoryInfo folderToUpload = new DirectoryInfo(dlg.SelectedPath);
        button1.Enabled = false;
        progressBar1.Maximum = folderToUpload.GetFiles("*", SearchOption.AllDirectories).Length; ;
        progressBar1.Value = 0;
        StartUpload(folderToUpload, ftp://ftpuser:ftppasswort@ftphost/ftpverzeichnis);
        MessageBox.Show("Upload Beendet");
        button1.Enabled = true;
      }
    }
Hier nutzen wir widerrum die .NET-Funktionalität und erstellen eine Instanz vom Typ FolderBrowserDialog. Wird von dieser Instanz die .ShowDialog()-Methode aufgerufen, wird ein Fenster angezeigt, in der der User einen Ordner auswählen kann (Welcher sich dann in der .SelectedPath-Eigenschaft befindet). Diesen Ordner wollen wir per FTP hochladen.
Zusätzlich disablen wir den Button und initialisieren die Eigenschaften der ProgressBar.
Per StartUpload() starten wir den Uploadvorgang. Ist dieser Beendet geben wir noch eine MessageBox aus und enablen den Button wieder.

StartUpload (rekursive Hilfsfunktion):
    private void StartUpload(DirectoryInfo folderToUpload, string requestUriString)
    {
      try
      {
        CreateFtpDirectory(requestUriString + "/" + folderToUpload.Name);

        // Upload der Dateien
        foreach (FileInfo file in folderToUpload.GetFiles())
        {
          WebClient client = new WebClient();
          client.Proxy = new WebProxy();
          client.UploadFileCompleted +=
            new UploadFileCompletedEventHandler(client_UploadFileCompleted);
          client.UploadFileAsync(
            new Uri(requestUriString + "/" + folderToUpload.Name + "/" + file.Name),
            file.FullName);
        }

        //Erstellen der Ordner
        foreach (DirectoryInfo dir in folderToUpload.GetDirectories())
        {
          Application.DoEvents();
          StartUpload(dir, requestUriString + "/" + folderToUpload.Name);
        }
      }
      catch (Exception ex)
      {
        MessageBox.Show(ex.Message);
      }
    }
Auch in dieser Funktion setzten wir alles wieder in einen Try-Catch Block um ein Abstürzen des Programms bei einem Fehler zu verhindern.
Direkt zu Anfang führen wir unsere Hilfsfunktion CreateFtpDirectory aus, welche uns auf dem FTP-Server einen Ordner mit übergebenen Parametern erstellt.
Anschliessen iterieren wir über jede Datei in diesem Verzeichnis und nutzen die Funktionalität der WebClient-Klasse. Um die Fortschrittsanzeige bei fertigem Upload zu aktualisieren, abonnieren wir das UploadFileCompletet-Ereignis bevor wir per .UploadFileAsync den Upload der Datei starten. Zur implementation dieses Ereignisses kommen wir später noch.
Nachdem wir alle Dateien zum FTP-Server geschickt haben, iterieren wir noch über alle Ordner in dem Ordner den wir hochladen wollen und rufen widerrum die StartUpload-Funktion auf. Somit erhalten wir eine Rekursion in der jeweils immer alle Ordner + Unterordner und dessen Dateien hochgeladen werden.
Das Applications.DoEvents() wird gebraucht, damit das UploadFileCompleted-Ereignis und somit die Fortschrittsanzeige ausgeführt wird.

Zu allerletzt Client-UploadFileCompleted-Ereignis:
    void client_UploadFileCompleted(object sender, UploadFileCompletedEventArgs e)
    {
      try
      {
        if (e.Error == null)
          progressBar1.Value++;
        else
          MessageBox.Show(e.Error.Message);
      }
      catch (Exception ex)
      {
        MessageBox.Show(ex.Message);
      }
    }
Auch hier wiederrum der Try-Catch Block. Die einzige 'Funktion' welche dieses Event erfüllt ist, dass bei Uploaderfolg die ProgressBar aktualisiert wird und andernfalls eine Fehlermeldung ausgegeben.

 

Dieses Tutorial könnte ebenfalls interessant für Sie sein: [C#] FTP Ordner Asynchron downloaden / runterladen (rekursiv)

  • Hans Werner

    schrieb am 2013-01-24 21:52:45

    einfach mal das downloaden/downgeloaded/gedownloaded usw. weglassen und ein einfaches herunterladen verwenden. Liesst sich besser und ist auch richtig.

    Auf Kommentar antworten

    • Jonny132

      schrieb am 2013-01-25 08:49:56

      Hallo Hans Werner,

      da gebe ich dir Recht, jedoch werden diese Begriffe nirgens verwendet bis auf in der Überschrift.
      Oder auf welchen Artikel beziehst du dich?

      sg

      Auf Kommentar antworten

Veröffentlichen Sie ihre Kommentare ...