Heim >Backend-Entwicklung >C++ >Wie lade ich Dateien und Unterverzeichnisse rekursiv über FTP in C# herunter?
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:
MLSD
unterstützen oder konsistente Verzeichnislisten verwenden, sollten Sie die Verwendung der WinSCP .NET-Assembly für einfachere rekursive Downloads in Betracht ziehen.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!