首页 >后端开发 >C++ >如何使用 C# 从 FTP 服务器递归下载文件和子目录?

如何使用 C# 从 FTP 服务器递归下载文件和子目录?

DDD
DDD原创
2025-01-12 15:01:43574浏览

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