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

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

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

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

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

堅牢なファイル同期ツールを構築するには、多くの場合、再帰的な FTP ダウンロードの複雑さを克服する必要があります。 一般的な課題は、ファイルとサブディレクトリの両方を処理することです。特に、ディレクトリをファイルとして扱うときにイライラする 550 エラーが発生した場合に起こります。この記事では、C# での再帰プログラミングを使用したソリューションを紹介します。

再帰的アプローチ

核となる解決策は再帰関数の設計にあります。 これにより、コードはネストされたディレクトリ構造を体系的に横断し、各レベルからファイルをダウンロードできるようになります。 FtpWebRequest は再帰を直接サポートしていないため、ファイルとディレクトリを区別する必要があります。 1 つの方法では、ダウンロードを試みます。失敗はディレクトリを示します。あるいは、ファイル拡張子に依存しても同じことを実現できます。

再帰関数の実装

次の C# 関数は、FTP ディレクトリの内容を再帰的にダウンロードします。

<code class="language-csharp">private void DownloadFtpDirectory(string url, NetworkCredential credentials, string localPath)
{
    FtpWebRequest listRequest = (FtpWebRequest)WebRequest.Create(url);
    listRequest.Method = WebRequestMethods.Ftp.ListDirectoryDetails;
    listRequest.Credentials = credentials;

    List<string> lines = new 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') // Directory
        {
            Directory.CreateDirectory(localFilePath);
            DownloadFtpDirectory(fileUrl + "/", credentials, localFilePath);
        }
        else // File
        {
            DownloadFtpFile(fileUrl, localFilePath);
        }
    }
}

private void DownloadFtpFile(string url, string localPath)
{
    // Code to download the file
}</code>
ログイン後にコピー

使用例:

この機能を使用するには:

<code class="language-csharp">NetworkCredential credentials = new NetworkCredential("user", "password");
string ftpUrl = "ftp://ftp.example.com/directory/to/download/";
DownloadFtpDirectory(ftpUrl, credentials, @"C:\local\target\directory\");</code>
ログイン後にコピー

機能拡張と考慮事項:

  • MLSD をサポートする FTP サーバー、または一貫したディレクトリ リストを使用する FTP サーバーの場合は、より単純な再帰ダウンロードのために WinSCP .NET アセンブリの使用を検討してください。
  • エラー処理 (550 エラーなど) を実装して、ユーザーに有益なフィードバックを提供します。

この改善されたアプローチは、C# で FTP 経由でファイルとサブディレクトリを再帰的にダウンロードするための、より堅牢で効率的なソリューションを提供します。 "user""password"、および FTP URL を実際の資格情報とターゲットの場所に置き換えてください。 実際のファイルのダウンロード プロセスを処理するには、DownloadFtpFile 関数を実装する必要があります。

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

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