首頁 >後端開發 >C++ >如何使用 C# 從 FTP 伺服器遞歸下載檔案和子目錄?

如何使用 C# 從 FTP 伺服器遞歸下載檔案和子目錄?

DDD
DDD原創
2025-01-12 15:01:43540瀏覽

使用C#遞迴下載FTP伺服器上的檔案與子目錄

問題:

目前程式碼僅列出並下載指定FTP目錄中的文件,但無法下載子目錄和子文件。此外,嘗試將資料夾下載為檔案時,伺服器傳回550錯誤。

解:

實作遞歸目錄列出與下載操作:

遞迴目錄列出:

  1. 使用特定協定的命令(如LIST或MLSD)列出遠端目錄。
  2. 解析目錄清單以識別檔案和目錄。
  3. 如果條目是文件,則使用DownloadFile方法下載它。
  4. 如果條目是目錄,則遞歸列出並下載其內容。

從子目錄中辨識檔案:

由於FtpWebRequest沒有明確的方法來實現這一點,因此可以選擇:

  • 嘗試對檔案有效但對目錄無效的操作(例如,DownloadFile)。
  • 基於檔案名稱模式識別檔案(例如,所有檔案都有副檔名)。
  • 使用特定於伺服器的目錄清單格式(例如,在Unix風格的清單中尋找行首的「d」表示目錄)。

範例遞歸下載程式碼:

<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>

使用方法:

<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>

或者,可以考慮使用WinSCP之類的第三方函式庫,它支援遞迴目錄操作,並可以處理各種FTP伺服器格式。

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

以上是如何使用 C# 從 FTP 伺服器遞歸下載檔案和子目錄?的詳細內容。更多資訊請關注PHP中文網其他相關文章!

陳述:
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn