ホームページ > バックエンド開発 > C++ > C# で FTP 経由ですべてのファイルとサブディレクトリを再帰的にダウンロードする方法は?

C# で FTP 経由ですべてのファイルとサブディレクトリを再帰的にダウンロードする方法は?

DDD
リリース: 2025-01-12 14:56:43
オリジナル
541 人が閲覧しました

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

ファイルとサブディレクトリの C# FTP 再帰ダウンロード

FTP を使用してファイルを自動的に同期する場合、ファイルやサブディレクトリのダウンロードで問題が発生することがよくあります。フォルダーはダウンロードされるファイルとして扱われるため、通常、これには 550 エラーが伴います。

ファイルとディレクトリを識別する

FTP 自体はファイルとディレクトリを明確に区別しません。したがって、その種類を識別するには他の方法が必要です。

  • ファイルをダウンロードしようとしています: 「ファイル」のダウンロードに失敗した場合、それはディレクトリである可能性があります。
  • ファイル拡張子: これは、特定のディレクトリ内のファイルのファイル拡張子が一貫している場合に、ファイルとディレクトリを区別するために使用できます。
  • サーバー固有のディレクトリリスト: ディレクトリリストコマンド (LIST など) に対するサーバーの応答を解析します。一部のサーバーでは、ディレクトリを示すために特定の文字または記号が使用されます。

ファイルの再帰的ダウンロード

すべてのファイル (サブディレクトリ内のファイルを含む) をダウンロードするには、次の手順に従います:

  1. リモート ディレクトリを一覧表示し、ディレクトリのリストを取得します。
  2. リストをループして、ファイルとディレクトリを区別します。
  3. ファイルの場合は、通常どおりダウンロードします。
  4. ディレクトリの場合は、手順 1 ~ 3 を再帰的に繰り返して、サブディレクトリ内のファイルを取得します。

コードの実装

次のコード例は、*nix スタイルのディレクトリ リストが使用されていることを前提として、FtpWebRequest クラスを使用した再帰的なファイルのダウンロードを示しています。

<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>
ログイン後にコピー

代替ライブラリ

機能の強化と MLSD コマンドのサポートについては、WinSCP.NET などのサードパーティ ライブラリの使用を検討してください。このライブラリは再帰的ダウンロードを簡素化し、さまざまなサーバー固有のディレクトリ リスト形式をサポートします。

<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>
ログイン後にコピー

の例では、FtpDownloadWithLibraryhostuser を実際の FTP サーバー情報に置き換える必要があることに注意してください。 password ライブラリをインストールする必要があります。 WinSCP.NET

以上がC# で FTP 経由ですべてのファイルとサブディレクトリを再帰的にダウンロードする方法は?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

ソース:php.cn
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート