Heim > Backend-Entwicklung > C++ > Wie lade ich alle Dateien und Unterverzeichnisse rekursiv über FTP in C# herunter?

Wie lade ich alle Dateien und Unterverzeichnisse rekursiv über FTP in C# herunter?

DDD
Freigeben: 2025-01-12 14:56:43
Original
541 Leute haben es durchsucht

How to Recursively Download All Files and Subdirectories via FTP in C#?

C# FTP rekursiver Download von Dateien und Unterverzeichnissen

Wenn Sie FTP zum automatischen Synchronisieren von Dateien verwenden, treten häufig Probleme beim Herunterladen von Dateien und Unterverzeichnissen auf. Dies wird normalerweise von einem 550-Fehler begleitet, da der Ordner als herunterzuladende Datei behandelt wird.

Dateien und Verzeichnisse identifizieren

FTP selbst unterscheidet nicht klar zwischen Dateien und Verzeichnissen. Daher sind andere Methoden erforderlich, um ihre Typen zu identifizieren.

  • Versuch, eine Datei herunterzuladen: Wenn der Versuch, eine „Datei“ herunterzuladen, fehlschlägt, kann es sich um ein Verzeichnis handeln.
  • Dateierweiterung: Dies kann zur Unterscheidung zwischen Dateien und Verzeichnissen verwendet werden, wenn die Dateierweiterungen für Dateien in einem bestimmten Verzeichnis konsistent sind.
  • Serverspezifische Verzeichnisauflistung: Parst die Antwort des Servers auf einen Verzeichnisauflistungsbefehl (z. B. LIST). Einige Server verwenden bestimmte Zeichen oder Symbole, um Verzeichnisse anzuzeigen.

Rekursiver Dateidownload

Um alle Dateien herunterzuladen (einschließlich derjenigen in Unterverzeichnissen), befolgen Sie diese Schritte:

  1. Entfernte Verzeichnisse auflisten und Verzeichnislisten abrufen.
  2. Durchlaufen Sie die Liste und unterscheiden Sie zwischen Dateien und Verzeichnissen.
  3. Dateien laden Sie wie gewohnt herunter.
  4. Wiederholen Sie für Verzeichnisse die Schritte 1–3 rekursiv, um Dateien in Unterverzeichnissen abzurufen.

Code-Implementierung

Das folgende Codebeispiel demonstriert das rekursive Herunterladen von Dateien mithilfe der FtpWebRequest-Klasse, vorausgesetzt, dass Verzeichnislisten im *nix-Stil verwendet werden:

<code class="language-csharp">using System;
using System.IO;
using System.Net;

public class FtpDownload
{
    public static void DownloadFtpDirectory(string url, NetworkCredential credentials, string localPath)
    {
        FtpWebRequest listRequest = (FtpWebRequest)WebRequest.Create(url);
        listRequest.Method = WebRequestMethods.Ftp.ListDirectoryDetails;
        listRequest.Credentials = credentials;

        var lines = new System.Collections.Generic.List<string>();

        using (var listResponse = (FtpWebResponse)listRequest.GetResponse())
        using (Stream listStream = listResponse.GetResponseStream())
        using (var listReader = new StreamReader(listStream))
        {
            while (!listReader.EndOfStream)
            {
                lines.Add(listReader.ReadLine());
            }
        }

        foreach (string line in lines)
        {
            string[] tokens = line.Split(new[] { ' ' }, 9, StringSplitOptions.RemoveEmptyEntries);
            string name = tokens[8];
            string permissions = tokens[0];

            string localFilePath = Path.Combine(localPath, name);
            string fileUrl = url + name;

            if (permissions[0] == 'd')
            {
                if (!Directory.Exists(localFilePath))
                {
                    Directory.CreateDirectory(localFilePath);
                }

                DownloadFtpDirectory(fileUrl + "/", credentials, localFilePath);
            }
            else
            {
                FtpWebRequest downloadRequest = (FtpWebRequest)WebRequest.Create(fileUrl);
                downloadRequest.Method = WebRequestMethods.Ftp.DownloadFile;
                downloadRequest.Credentials = credentials;

                using (FtpWebResponse downloadResponse = (FtpWebResponse)downloadRequest.GetResponse())
                using (Stream sourceStream = downloadResponse.GetResponseStream())
                using (Stream targetStream = File.Create(localFilePath))
                {
                    byte[] buffer = new byte[10240];
                    int read;
                    while ((read = sourceStream.Read(buffer, 0, buffer.Length)) > 0)
                    {
                        targetStream.Write(buffer, 0, read);
                    }
                }
            }
        }
    }
}</code>
Nach dem Login kopieren

Alternative Bibliothek

Für erweiterte Funktionalität und Unterstützung für MLSD-Befehle sollten Sie die Verwendung einer Drittanbieterbibliothek wie WinSCP.NET in Betracht ziehen. Diese Bibliothek vereinfacht das rekursive Herunterladen und unterstützt verschiedene serverspezifische Verzeichnislistenformate.

<code class="language-csharp">using System;
using System.IO;
using WinSCP;

public class FtpDownloadWithLibrary
{
    public static void DownloadFtpDirectory(string url, NetworkCredential credentials, string localPath)
    {
        // 设置会话选项
        SessionOptions sessionOptions = new SessionOptions
        {
            Protocol = Protocol.Ftp,
            HostName = host, // 请替换为你的主机名
            UserName = user, // 请替换为你的用户名
            Password = password, // 请替换为你的密码
        };

        using (Session session = new Session())
        {
            // 连接
            session.Open(sessionOptions);

            // 下载文件
            session.GetFiles(url, localPath).Check();
        }
    }
}</code>
Nach dem Login kopieren

Bitte beachten Sie, dass Sie im FtpDownloadWithLibrary Beispiel host, user, password durch Ihre tatsächlichen FTP-Serverinformationen ersetzen müssen. Und Sie müssen die WinSCP.NET-Bibliothek installieren.

Das obige ist der detaillierte Inhalt vonWie lade ich alle Dateien und Unterverzeichnisse rekursiv über FTP in C# herunter?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Quelle:php.cn
Erklärung dieser Website
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn
Beliebte Tutorials
Mehr>
Neueste Downloads
Mehr>
Web-Effekte
Quellcode der Website
Website-Materialien
Frontend-Vorlage