C# FTP muat turun rekursif fail dan subdirektori
Apabila menggunakan FTP untuk menyegerakkan fail secara automatik, anda sering menghadapi masalah memuat turun fail dan subdirektori. Ini biasanya disertai dengan ralat 550 kerana folder itu dianggap sebagai fail untuk dimuat turun.
Kenal pasti fail dan direktori
FTP sendiri tidak membezakan antara fail dan direktori dengan jelas. Oleh itu, kaedah lain diperlukan untuk mengenal pasti jenisnya.
Muat turun fail rekursif
Untuk memuat turun semua fail (termasuk fail dalam subdirektori), ikut langkah berikut:
Pelaksanaan kod
Contoh kod berikut menunjukkan muat turun fail rekursif menggunakan kelas FtpWebRequest, dengan mengandaikan * penyenaraian direktori gaya nix digunakan:
<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>
Perpustakaan alternatif
Untuk kefungsian dan sokongan yang dipertingkatkan untuk arahan MLSD, pertimbangkan untuk menggunakan perpustakaan pihak ketiga seperti WinSCP.NET. Pustaka ini memudahkan muat turun rekursif dan menyokong pelbagai format penyenaraian direktori khusus pelayan.
<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>
Sila ambil perhatian bahawa dalam contoh FtpDownloadWithLibrary
anda perlu menggantikan host
, user
, password
dengan maklumat pelayan FTP sebenar anda. Dan anda perlu memasang perpustakaan WinSCP.NET
.
Atas ialah kandungan terperinci Bagaimana untuk Muat Turun Secara Rekursif Semua Fail dan Subdirektori melalui FTP dalam C#?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!