如何从网站获取文件名列表?C#提取指定URL下JPG文件名
嘿,这个需求我刚好做过类似的!要从www.demo.com/public这个公开目录里获取所有.jpg文件名列表,得先确认一件事:这个目录必须开启了服务器的目录浏览功能——要是网站没开这个,服务器不会返回文件列表页面,咱们的方法可就用不了啦。
具体实现步骤
1. 准备依赖包
要解析目录页面的HTML内容,我推荐用HtmlAgilityPack这个工具包,它处理HTML节点非常方便。你可以通过NuGet安装它:
- 用Package Manager控制台:
Install-Package HtmlAgilityPack - 用.NET CLI:
dotnet add package HtmlAgilityPack
2. 编写C#代码
下面是完整的实现代码,我加了详细注释,你可以直接参考:
首先引入必要的命名空间:
using System; using System.Collections.Generic; using System.Linq; using System.Net.Http; using System.Threading.Tasks; using HtmlAgilityPack;
然后写核心方法:
public static async Task<List<string>> GetJpgFileNamesFromPublicDir(string targetUrl) { var jpgFileNames = new List<string>(); // 注意:实际项目里建议复用HttpClient,不要每次调用都新建,避免socket资源耗尽 using var httpClient = new HttpClient(); try { // 获取目标目录页面的HTML内容 var pageHtml = await httpClient.GetStringAsync(targetUrl); // 加载HTML到HtmlDocument对象,方便解析节点 var htmlDoc = new HtmlDocument(); htmlDoc.LoadHtml(pageHtml); // 提取页面中所有带href属性的<a>标签(目录浏览页面里的文件链接都在这里) var allLinks = htmlDoc.DocumentNode.SelectNodes("//a[@href]"); if (allLinks != null) { foreach (var linkNode in allLinks) { var hrefValue = linkNode.GetAttributeValue("href", string.Empty); // 筛选条件:是.jpg结尾的文件,同时排除上级目录的../链接 if (!string.IsNullOrWhiteSpace(hrefValue) && hrefValue.EndsWith(".jpg", StringComparison.OrdinalIgnoreCase) && !hrefValue.StartsWith("../")) { // 提取文件名(如果href是完整URL,Path.GetFileName也能正确获取最后一段) var fileName = System.IO.Path.GetFileName(hrefValue); if (!string.IsNullOrWhiteSpace(fileName)) { jpgFileNames.Add(fileName); } } } } } catch (HttpRequestException ex) { Console.WriteLine($"请求页面时出错:{ex.Message}"); } catch (Exception ex) { Console.WriteLine($"发生未知错误:{ex.Message}"); } return jpgFileNames; }
调用示例:
public static async Task Main(string[] args) { var targetDirectoryUrl = "https://www.demo.com/public"; var jpgFiles = await GetJpgFileNamesFromPublicDir(targetDirectoryUrl); // 输出所有获取到的.jpg文件名 foreach (var fileName in jpgFiles) { Console.WriteLine($"找到文件:{fileName}"); } }
3. 关键注意事项
- 目录浏览权限:再次强调,必须确保目标目录开启了目录浏览,否则服务器会返回403禁止访问或者自定义页面,根本解析不到文件列表。
- 页面结构变化:如果网站的目录页面HTML结构有调整(比如链接不在标签里,或者href格式变了),你需要修改XPath选择器和筛选逻辑来适配。
- HttpClient复用:在正式项目里,不要每次调用都新建HttpClient,建议通过依赖注入或者单例模式复用,避免出现socket资源耗尽的问题。
- 编码兼容:如果目标页面的编码不是UTF-8,你可能需要手动指定编码,或者让HttpClient自动检测页面编码。
内容的提问来源于stack exchange,提问作者Yogesh Dangre
相关产品推荐
相关产品推荐

