You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在C# .NET 6中从Web URI下载全部文件及文件夹(含子目录)?

在C# .NET 6中下载Web目录页面的全部内容

可以实现,核心思路是解析目录页面的HTML内容,提取其中的文件和子目录链接,再递归遍历下载所有资源。以下是具体实现步骤和代码示例:

实现步骤

  • 发送GET请求获取目录页面的HTML内容
  • 解析HTML,提取页面中的文件链接和子目录链接(排除../这类上级目录链接)
  • 对于文件链接:直接下载到本地对应路径
  • 对于子目录链接:递归调用上述流程,继续遍历下载子目录内的内容

代码示例

首先安装HtmlAgilityPack NuGet包(.NET生态常用的HTML解析库):

Install-Package HtmlAgilityPack

核心实现代码:

using HtmlAgilityPack;
using System.Net.Http;
using System.IO;

public class WebDirectoryDownloader
{
    private readonly HttpClient _httpClient;
    private readonly string _baseLocalPath;

    public WebDirectoryDownloader(string baseLocalPath)
    {
        _httpClient = new HttpClient();
        _baseLocalPath = baseLocalPath;
        Directory.CreateDirectory(baseLocalPath);
    }

    public async Task DownloadDirectoryAsync(string webDirectoryUrl)
    {
        // 确保URL以斜杠结尾,避免路径拼接错误
        if (!webDirectoryUrl.EndsWith("/"))
            webDirectoryUrl += "/";

        // 获取目录页面HTML
        var htmlContent = await _httpClient.GetStringAsync(webDirectoryUrl);
        var htmlDoc = new HtmlDocument();
        htmlDoc.LoadHtml(htmlContent);

        // 提取所有有效链接
        var links = htmlDoc.DocumentNode.SelectNodes("//a[@href]")?
            .Select(a => a.GetAttributeValue("href", ""))
            .Where(href => !string.IsNullOrEmpty(href) && href != "../")
            .ToList();

        if (links == null) return;

        foreach (var link in links)
        {
            var fullWebUrl = new Uri(new Uri(webDirectoryUrl), link).ToString();
            var localRelativePath = link.TrimEnd('/');
            var fullLocalPath = Path.Combine(_baseLocalPath, localRelativePath);

            if (link.EndsWith("/"))
            {
                // 处理子目录,递归下载
                Directory.CreateDirectory(fullLocalPath);
                await DownloadDirectoryAsync(fullWebUrl);
            }
            else
            {
                // 处理文件,直接下载
                using var fileStream = new FileStream(fullLocalPath, FileMode.Create);
                var response = await _httpClient.GetAsync(fullWebUrl);
                response.EnsureSuccessStatusCode();
                await response.Content.CopyToAsync(fileStream);
            }
        }
    }
}

// 使用示例
class Program
{
    static async Task Main(string[] args)
    {
        string webUrl = "https://hls.gsfc.nasa.gov/data/other/HLSQA2/"; // 替换为你的服务器目录URL
        string localSavePath = @"C:\Downloads\WebDirectory"; // 替换为本地保存路径

        var downloader = new WebDirectoryDownloader(localSavePath);
        await downloader.DownloadDirectoryAsync(webUrl);
        Console.WriteLine("下载完成");
    }
}

注意事项

  • 确保你的Web服务器已开启目录浏览功能,否则无法解析到文件和子目录链接
  • 处理大文件时,可添加进度监控、断点续传等逻辑
  • 建议添加try-catch块捕获网络异常,提升程序稳定性
  • 尊重服务器带宽限制,避免高频请求给服务器造成压力

内容的提问来源于stack exchange,提问作者CrazyEight

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.11 23:34:59