首頁 > 後端開發 > C++ > 如何在C#中透過FTP遞歸下載所有檔案和子目錄?

如何在C#中透過FTP遞歸下載所有檔案和子目錄?

DDD
發布: 2025-01-12 14:56:43
原創
540 人瀏覽過

How to Recursively Download All Files and Subdirectories via FTP in C#?

C# FTP遞迴下載檔案與子目錄

使用FTP自動同步檔案時,常會遇到下載檔案和子目錄的難題。由於將資料夾視為要下載的文件,這通常伴隨著550錯誤。

辨識檔案與目錄

FTP 本身並沒有清晰地區分檔和目錄。因此,需要使用其他方法來識別它們的類型。

  • 嘗試下載檔案:如果嘗試下載「檔案」失敗,則可能是目錄。
  • 檔案副檔名:當特定目錄中的檔案的檔案副檔名一致時,這可以用來區分檔案和目錄。
  • 伺服器特定的目錄清單:解析伺服器對目錄清單指令(例如,LIST)的回應。某些伺服器使用特定字元或符號來指示目錄。

遞迴檔案下載

要下載所有檔案(包括子目錄中的檔案),請依照下列步驟操作:

  1. 列出遠端目錄並檢索目錄清單。
  2. 遍歷清單並區分檔案和目錄。
  3. 對於文件,照常下載它們。
  4. 對於目錄,遞歸重複步驟 1-3 以檢索子目錄中的檔案。

程式碼實作

以下程式碼範例示範了使用 FtpWebRequest 類別進行遞歸檔案下載,假設使用的是 *nix 風格的目錄清單:

<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, password 為你的實際 FTP 伺服器資訊。 並且你需要安裝 WinSCP.NET 函式庫。

以上是如何在C#中透過FTP遞歸下載所有檔案和子目錄?的詳細內容。更多資訊請關注PHP中文網其他相關文章!

來源:php.cn
本網站聲明
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn
熱門教學
更多>
最新下載
更多>
網站特效
網站源碼
網站素材
前端模板