Heim >Backend-Entwicklung >C++ >Wie kann ich mit C# rekursiv Dateien und Unterverzeichnisse von einem FTP-Server herunterladen?

Wie kann ich mit C# rekursiv Dateien und Unterverzeichnisse von einem FTP-Server herunterladen?

DDD
DDDOriginal
2025-01-12 15:01:43536Durchsuche

Verwenden Sie C#, um Dateien und Unterverzeichnisse rekursiv auf einen FTP-Server herunterzuladen

Frage:

Der aktuelle Code listet nur Dateien im angegebenen FTP-Verzeichnis auf und lädt sie herunter, kann jedoch keine Unterverzeichnisse und Unterdateien herunterladen. Darüber hinaus gibt der Server beim Versuch, den Ordner als Datei herunterzuladen, einen Fehler 550 zurück.

Lösung:

Rekursive Verzeichnisauflistung und Download-Vorgänge implementieren:

Rekursive Verzeichnisliste:

  1. Remote-Verzeichnisse mit protokollspezifischen Befehlen wie LIST oder MLSD auflisten.
  2. Parsen Sie Verzeichnislisten, um Dateien und Verzeichnisse zu identifizieren.
  3. Wenn es sich bei dem Eintrag um eine Datei handelt, verwenden Sie die DownloadFile-Methode, um sie herunterzuladen.
  4. Wenn es sich bei dem Eintrag um ein Verzeichnis handelt, listen Sie dessen Inhalt rekursiv auf und laden Sie ihn herunter.

Dateien aus Unterverzeichnissen identifizieren:

Da FtpWebRequest keine explizite Möglichkeit hat, dies zu erreichen, lautet die Alternative:

  • Versuchen Sie einen Vorgang, der für Dateien, aber nicht für Verzeichnisse gültig ist (z. B. DownloadFile).
  • Identifiziert Dateien anhand von Dateinamenmustern (z. B. haben alle Dateien eine Erweiterung).
  • Verwenden Sie ein serverspezifisches Verzeichnislistenformat (suchen Sie beispielsweise in einer Liste im Unix-Stil nach einem Verzeichnis mit einem „d“ am Anfang der Zeile).

Beispiel für einen rekursiven Downloadcode:

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

Verwendung:

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

Erwägen Sie alternativ die Verwendung einer Drittanbieterbibliothek wie WinSCP, die rekursive Verzeichnisoperationen unterstützt und verschiedene FTP-Serverformate verarbeiten kann.

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

Das obige ist der detaillierte Inhalt vonWie kann ich mit C# rekursiv Dateien und Unterverzeichnisse von einem FTP-Server herunterladen?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Stellungnahme:
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn