Maison >développement back-end >C++ >Comment télécharger de manière récursive des fichiers et des sous-répertoires via FTP en C# ?
Téléchargement FTP récursif C# : conquête des sous-répertoires et des fichiers
Créer un outil de synchronisation de fichiers robuste implique souvent de naviguer dans les complexités des téléchargements FTP récursifs. Un défi courant consiste à gérer à la fois les fichiers et les sous-répertoires, en particulier lorsque l'on rencontre l'erreur frustrante 550 lors du traitement des répertoires comme des fichiers. Cet article présente une solution utilisant la programmation récursive en C#.
L'approche récursive
La solution principale réside dans la conception de fonctions récursives. Cela permet au code de parcourir systématiquement les structures de répertoires imbriquées, en téléchargeant les fichiers de chaque niveau. Puisque FtpWebRequest
ne prend pas directement en charge la récursivité, nous devons faire la distinction entre les fichiers et les répertoires. Une méthode consiste à tenter un téléchargement ; un échec indique un répertoire. Alternativement, s'appuyer sur des extensions de fichiers peut obtenir le même résultat.
Implémentation de fonctions récursives
La fonction C# suivante télécharge de manière récursive le contenu d'un répertoire FTP :
<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>
Exemple d'utilisation :
Pour utiliser cette fonction :
<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>
Améliorations et considérations :
MLSD
ou utilisant des listes de répertoires cohérentes, envisagez d'utiliser l'assembly WinSCP .NET pour des téléchargements récursifs plus simples.Cette approche améliorée fournit une solution plus robuste et efficace pour télécharger de manière récursive des fichiers et des sous-répertoires via FTP en C#. N'oubliez pas de remplacer "user"
, "password"
et l'URL FTP par vos informations d'identification réelles et votre emplacement cible. La fonction DownloadFtpFile
doit être implémentée pour gérer le processus de téléchargement de fichiers réel.
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!