Maison >développement back-end >C++ >Comment puis-je télécharger de manière récursive des fichiers et des sous-répertoires à partir d'un serveur FTP en utilisant C# ?

Comment puis-je télécharger de manière récursive des fichiers et des sous-répertoires à partir d'un serveur FTP en utilisant C# ?

DDD
DDDoriginal
2025-01-12 15:01:43536parcourir

Utilisez C# pour télécharger de manière récursive des fichiers et sous-répertoires sur un serveur FTP

Question :

Le code actuel répertorie et télécharge uniquement les fichiers dans le répertoire FTP spécifié, mais ne peut pas télécharger les sous-répertoires et sous-fichiers. De plus, lorsque vous essayez de télécharger le dossier sous forme de fichier, le serveur renvoie une erreur 550.

Solution :

Mettre en œuvre des opérations récursives de listage et de téléchargement des répertoires :

Liste récursive des répertoires :

  1. Répertoriez les répertoires distants à l'aide de commandes spécifiques au protocole telles que LIST ou MLSD.
  2. Analyser les listes de répertoires pour identifier les fichiers et les répertoires.
  3. Si l'entrée est un fichier, utilisez la méthode DownloadFile pour la télécharger.
  4. Si l'entrée est un répertoire, répertoriez et téléchargez de manière récursive son contenu.

Identifier les fichiers des sous-répertoires :

Puisque FtpWebRequest n'a aucun moyen explicite d'y parvenir, l'alternative est :

  • Tentez une opération valide pour les fichiers mais pas pour les répertoires (par exemple, DownloadFile).
  • Identifie les fichiers en fonction de modèles de nom de fichier (par exemple, tous les fichiers ont une extension).
  • Utilisez un format de liste de répertoires spécifique au serveur (par exemple, recherchez un répertoire avec un "d" au début de la ligne dans une liste de style Unix).

Exemple de code de téléchargement récursif :

<code class="language-csharp">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 List<string>();
    using (var listResponse = (FtpWebResponse)listRequest.GetResponse())
    using (var listStream = listResponse.GetResponseStream())
    using (var listReader = new StreamReader(listStream))
    {
        while (!listReader.EndOfStream)
        {
            lines.Add(listReader.ReadLine());
        }
    }

    // 迭代目录条目
    foreach (var line in lines)
    {
        var tokens = line.Split(' ', 9, StringSplitOptions.RemoveEmptyEntries);
        var name = tokens[8];
        var permissions = tokens[0];

        var localFilePath = Path.Combine(localPath, name);
        var fileUrl = url + name + "/";

        // 如果是目录,则递归
        if (permissions[0] == 'd')
        {
            if (!Directory.Exists(localFilePath))
            {
                Directory.CreateDirectory(localFilePath);
            }

            DownloadFtpDirectory(fileUrl, credentials, localFilePath);
        }
        // 如果是文件,则下载
        else
        {
            var downloadRequest = (FtpWebRequest)WebRequest.Create(fileUrl);
            downloadRequest.Method = WebRequestMethods.Ftp.DownloadFile;
            downloadRequest.Credentials = credentials;

            using (FtpWebResponse downloadResponse = (FtpWebResponse)downloadRequest.GetResponse())
            using (var sourceStream = downloadResponse.GetResponseStream())
            using (var 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>

Utilisation :

<code class="language-csharp">var credentials = new NetworkCredential("user", "password");
var url = "ftp://ftp.example.com/directory/to/download/";
var localPath = @"C:\target\directory";
DownloadFtpDirectory(url, credentials, localPath);</code>

Vous pouvez également envisager d'utiliser une bibliothèque tierce telle que WinSCP, qui prend en charge les opérations de répertoire récursives et peut gérer divers formats de serveur FTP.

How can I recursively download files and subdirectories from an FTP server using C#?

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