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.
Rekursiver Dateidownload
Um alle Dateien herunterzuladen (einschließlich derjenigen in Unterverzeichnissen), befolgen Sie diese Schritte:
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>
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>
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!