如何在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
相关产品推荐
相关产品推荐

