Téléchargement récursif C# FTP de fichiers et sous-répertoires
Lorsque vous utilisez FTP pour synchroniser automatiquement des fichiers, vous rencontrez souvent des problèmes pour télécharger des fichiers et des sous-répertoires. Ceci s'accompagne généralement d'une erreur 550 puisque le dossier est traité comme un fichier à télécharger.
Identifier les fichiers et répertoires
FTP lui-même ne fait pas clairement la distinction entre les fichiers et les répertoires. Par conséquent, d’autres méthodes sont nécessaires pour identifier leurs types.
Téléchargement de fichiers récursif
Pour télécharger tous les fichiers (y compris ceux des sous-répertoires), suivez ces étapes :
Mise en œuvre du code
L'exemple de code suivant illustre le téléchargement récursif de fichiers à l'aide de la classe FtpWebRequest, en supposant que des listes de répertoires de style *nix sont utilisées :
<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>
Bibliothèque alternative
Pour des fonctionnalités améliorées et une prise en charge des commandes MLSD, envisagez d'utiliser une bibliothèque tierce telle que WinSCP.NET. Cette bibliothèque simplifie le téléchargement récursif et prend en charge divers formats de liste de répertoires spécifiques au serveur.
<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>
Veuillez noter que dans l'exemple FtpDownloadWithLibrary
, vous devez remplacer host
, user
, password
par les informations réelles de votre serveur FTP. Et vous devez installer la bibliothèque WinSCP.NET
.
Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!