C# を使用して FTP サーバー上のファイルとサブディレクトリを再帰的にダウンロードします
質問:
現在のコードは、指定された FTP ディレクトリ内のファイルを一覧表示してダウンロードするだけですが、サブディレクトリとサブファイルはダウンロードできません。さらに、フォルダーをファイルとしてダウンロードしようとすると、サーバーは 550 エラーを返します。
解決策:
再帰的なディレクトリの一覧表示とダウンロード操作を実装します:
再帰ディレクトリリスト:
サブディレクトリからファイルを識別します:
FtpWebRequest にはこれを実現する明示的な方法がないため、代替手段は次のとおりです。
再帰ダウンロード コードの例:
<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 などのサードパーティ ライブラリの使用を検討してください。
以上がC# を使用して FTP サーバーからファイルとサブディレクトリを再帰的にダウンロードするにはどうすればよいですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。