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# ?

Comment télécharger de manière récursive des fichiers et des sous-répertoires via FTP en C# ?

DDD
DDDoriginal
2025-01-12 15:14:41666parcourir

How to Recursively Download Files and Subdirectories via FTP in 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 :

  • Pour les serveurs FTP prenant en charge 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.
  • Implémentez la gestion des erreurs (par exemple, pour l'erreur 550) pour fournir des commentaires informatifs à l'utilisateur.

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!

Déclaration:
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn