Maison > développement back-end > C++ > Comment télécharger de manière récursive tous les fichiers et sous-répertoires via FTP en C# ?

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

DDD
Libérer: 2025-01-12 14:56:43
original
540 Les gens l'ont consulté

How to Recursively Download All Files and Subdirectories via FTP in C#?

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.

  • Tentative de téléchargement de fichier : Si une tentative de téléchargement de "fichier" échoue, il peut s'agir d'un répertoire.
  • Extension de fichier : Cela peut être utilisé pour différencier les fichiers et les répertoires lorsque les extensions de fichiers d'un répertoire spécifique sont cohérentes.
  • Liste de répertoires spécifique au serveur : Analyse la réponse du serveur à une commande de liste de répertoires (par exemple, LIST). Certains serveurs utilisent des caractères ou des symboles spécifiques pour indiquer les répertoires.

Téléchargement de fichiers récursif

Pour télécharger tous les fichiers (y compris ceux des sous-répertoires), suivez ces étapes :

  1. Répertoriez les répertoires distants et récupérez les listes de répertoires.
  2. Parcourez la liste et différenciez les fichiers et les répertoires.
  3. Pour les fichiers, téléchargez-les comme d'habitude.
  4. Pour les répertoires, répétez les étapes 1 à 3 de manière récursive pour récupérer les fichiers dans les sous-répertoires.

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>
Copier après la connexion

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>
Copier après la connexion

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!

source:php.cn
Déclaration de ce site Web
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
Tutoriels populaires
Plus>
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal