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

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

DDD
DDDOriginal
2025-01-12 15:14:41666Durchsuche

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

C# Rekursiver FTP-Download: Unterverzeichnisse und Dateien erobern

Der Aufbau eines robusten Dateisynchronisierungstools erfordert häufig die Bewältigung der Komplexität rekursiver FTP-Downloads. Eine häufige Herausforderung besteht darin, sowohl Dateien als auch Unterverzeichnisse zu verarbeiten, insbesondere wenn bei der Behandlung von Verzeichnissen als Dateien der frustrierende Fehler 550 auftritt. Dieser Artikel stellt eine Lösung mit rekursiver Programmierung in C# vor.

Der rekursive Ansatz

Die Kernlösung liegt im rekursiven Funktionsdesign. Dadurch kann der Code systematisch verschachtelte Verzeichnisstrukturen durchqueren und Dateien von jeder Ebene herunterladen. Da FtpWebRequest die Rekursion nicht direkt unterstützt, müssen wir zwischen Dateien und Verzeichnissen unterscheiden. Eine Methode besteht darin, einen Download zu versuchen; Ein Fehler weist auf ein Verzeichnis hin. Alternativ können Sie dasselbe erreichen, indem Sie sich auf Dateierweiterungen verlassen.

Rekursive Funktionsimplementierung

Die folgende C#-Funktion lädt den Inhalt eines FTP-Verzeichnisses rekursiv herunter:

<code class="language-csharp">private void DownloadFtpDirectory(string url, NetworkCredential credentials, string localPath)
{
    FtpWebRequest listRequest = (FtpWebRequest)WebRequest.Create(url);
    listRequest.Method = WebRequestMethods.Ftp.ListDirectoryDetails;
    listRequest.Credentials = credentials;

    List<string> lines = new 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') // Directory
        {
            Directory.CreateDirectory(localFilePath);
            DownloadFtpDirectory(fileUrl + "/", credentials, localFilePath);
        }
        else // File
        {
            DownloadFtpFile(fileUrl, localFilePath);
        }
    }
}

private void DownloadFtpFile(string url, string localPath)
{
    // Code to download the file
}</code>

Verwendungsbeispiel:

Um diese Funktion zu verwenden:

<code class="language-csharp">NetworkCredential credentials = new NetworkCredential("user", "password");
string ftpUrl = "ftp://ftp.example.com/directory/to/download/";
DownloadFtpDirectory(ftpUrl, credentials, @"C:\local\target\directory\");</code>

Verbesserungen und Überlegungen:

  • Für FTP-Server, die MLSD unterstützen oder konsistente Verzeichnislisten verwenden, sollten Sie die Verwendung der WinSCP .NET-Assembly für einfachere rekursive Downloads in Betracht ziehen.
  • Implementieren Sie die Fehlerbehandlung (z. B. für den Fehler 550), um dem Benutzer informatives Feedback zu geben.

Dieser verbesserte Ansatz bietet eine robustere und effizientere Lösung für das rekursive Herunterladen von Dateien und Unterverzeichnissen über FTP in C#. Denken Sie daran, "user", "password" und die FTP-URL durch Ihre tatsächlichen Anmeldeinformationen und den Zielort zu ersetzen. Die Funktion DownloadFtpFile muss implementiert werden, um den eigentlichen Datei-Download-Prozess abzuwickeln.

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

Stellungnahme:
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