Rumah > pembangunan bahagian belakang > C++ > Bagaimanakah saya boleh memuat turun fail dan subdirektori secara rekursif daripada pelayan FTP menggunakan C#?

Bagaimanakah saya boleh memuat turun fail dan subdirektori secara rekursif daripada pelayan FTP menggunakan C#?

DDD
Lepaskan: 2025-01-12 15:01:43
asal
535 orang telah melayarinya

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:

  1. Senaraikan direktori jauh menggunakan arahan khusus protokol seperti LIST atau MLSD.
  2. Menghuraikan senarai direktori untuk mengenal pasti fail dan direktori.
  3. Jika entri ialah fail, gunakan kaedah Muat TurunFail untuk memuat turunnya.
  4. Jika entri ialah direktori, senaraikan secara rekursif dan muat turun kandungannya.

Kenal pasti fail daripada subdirektori:

Memandangkan FtpWebRequest tidak mempunyai cara yang jelas untuk mencapai ini, alternatifnya ialah:

  • Cuba operasi yang sah untuk fail tetapi bukan untuk direktori (cth., Muat turunFail).
  • Mengenal pasti fail berdasarkan corak nama fail (cth. semua fail mempunyai sambungan).
  • Gunakan format penyenaraian direktori khusus pelayan (cth. cari direktori dengan "d" pada permulaan baris dalam penyenaraian gaya Unix).

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>
Salin selepas log masuk

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>
Salin selepas log masuk

Sebagai alternatif, pertimbangkan untuk menggunakan perpustakaan pihak ketiga seperti WinSCP, yang menyokong operasi direktori rekursif dan boleh mengendalikan pelbagai format pelayan FTP.

How can I recursively download files and subdirectories from an FTP server using C#?

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!

sumber:php.cn
Kenyataan Laman Web ini
Kandungan artikel ini disumbangkan secara sukarela oleh netizen, dan hak cipta adalah milik pengarang asal. Laman web ini tidak memikul tanggungjawab undang-undang yang sepadan. Jika anda menemui sebarang kandungan yang disyaki plagiarisme atau pelanggaran, sila hubungi admin@php.cn
Tutorial Popular
Lagi>
Muat turun terkini
Lagi>
kesan web
Kod sumber laman web
Bahan laman web
Templat hujung hadapan