Gunakan C# untuk memuat turun fail dan subdirektori secara rekursif pada pelayan FTP
Soalan:
Kod semasa hanya menyenaraikan dan memuat turun fail dalam direktori FTP yang ditentukan, tetapi tidak boleh memuat turun subdirektori dan subfail. Selain itu, apabila cuba memuat turun folder sebagai fail, pelayan mengembalikan ralat 550.
Penyelesaian:
Laksanakan penyenaraian direktori rekursif dan operasi muat turun:
Penyenaraian direktori rekursif:
Kenal pasti fail daripada subdirektori:
Memandangkan FtpWebRequest tidak mempunyai cara yang jelas untuk mencapai ini, alternatifnya ialah:
Contoh kod muat turun rekursif:
<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>
Penggunaan:
<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>
Sebagai alternatif, pertimbangkan untuk menggunakan perpustakaan pihak ketiga seperti WinSCP, yang menyokong operasi direktori rekursif dan boleh mengendalikan pelbagai format pelayan FTP.
Atas ialah kandungan terperinci Bagaimanakah saya boleh memuat turun fail dan subdirektori secara rekursif daripada pelayan FTP menggunakan C#?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!