ファイルとサブディレクトリの C# FTP 再帰ダウンロード
FTP を使用してファイルを自動的に同期する場合、ファイルやサブディレクトリのダウンロードで問題が発生することがよくあります。フォルダーはダウンロードされるファイルとして扱われるため、通常、これには 550 エラーが伴います。
ファイルとディレクトリを識別する
FTP 自体はファイルとディレクトリを明確に区別しません。したがって、その種類を識別するには他の方法が必要です。
ファイルの再帰的ダウンロード
すべてのファイル (サブディレクトリ内のファイルを含む) をダウンロードするには、次の手順に従います:
コードの実装
次のコード例は、*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>
の例では、FtpDownloadWithLibrary
、host
、user
を実際の FTP サーバー情報に置き換える必要があることに注意してください。 password
ライブラリをインストールする必要があります。 WinSCP.NET
以上がC# で FTP 経由ですべてのファイルとサブディレクトリを再帰的にダウンロードする方法は?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。