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 アセンブリの使用を検討してください。この改善されたアプローチは、C# で FTP 経由でファイルとサブディレクトリを再帰的にダウンロードするための、より堅牢で効率的なソリューションを提供します。 "user"
、"password"
、および FTP URL を実際の資格情報とターゲットの場所に置き換えてください。 実際のファイルのダウンロード プロセスを処理するには、DownloadFtpFile
関数を実装する必要があります。
以上がC# で FTP 経由でファイルとサブディレクトリを再帰的にダウンロードするにはどうすればよいですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。