ホームページ > バックエンド開発 > C++ > C# を使用して FTP サーバーからファイルとサブディレクトリを再帰的にダウンロードするにはどうすればよいですか?

C# を使用して FTP サーバーからファイルとサブディレクトリを再帰的にダウンロードするにはどうすればよいですか?

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

C# を使用して FTP サーバー上のファイルとサブディレクトリを再帰的にダウンロードします

質問:

現在のコードは、指定された FTP ディレクトリ内のファイルを一覧表示してダウンロードするだけですが、サブディレクトリとサブファイルはダウンロードできません。さらに、フォルダーをファイルとしてダウンロードしようとすると、サーバーは 550 エラーを返します。

解決策:

再帰的なディレクトリの一覧表示とダウンロード操作を実装します:

再帰ディレクトリリスト:

  1. LIST や MLSD などのプロトコル固有のコマンドを使用して、リモート ディレクトリを一覧表示します。
  2. ディレクトリのリストを解析してファイルとディレクトリを識別します。
  3. エントリがファイルの場合は、DownloadFile メソッドを使用してダウンロードします。
  4. エントリがディレクトリの場合、その内容を再帰的に一覧表示してダウンロードします。

サブディレクトリからファイルを識別します:

FtpWebRequest にはこれを実現する明示的な方法がないため、代替手段は次のとおりです。

  • ファイルには有効だがディレクトリには無効な操作 (DownloadFile など) を試行します。
  • ファイル名パターンに基づいてファイルを識別します (例: すべてのファイルに拡張子が付いています)。
  • サーバー固有のディレクトリ リスト形式を使用します (たとえば、Unix スタイルのリストで行の先頭に「d」があるディレクトリを探します)。

再帰ダウンロード コードの例:

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

使用法:

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

代わりに、再帰的なディレクトリ操作をサポートし、さまざまな FTP サーバー形式を処理できる WinSCP などのサードパーティ ライブラリの使用を検討してください。

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

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

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