如何使用FluentFTP在C#中高效获取并删除指定日期前的文件?
使用FluentFTP高效查找并删除早于X天的旧文件
你当前用GetListing遍历文件再判断日期的方法可行,但可以从这几个方向优化:
缩小初始文件列表范围
用ListOptions.FileList参数只获取文件(排除目录),不用手动判断文件类型,减少后续过滤的工作量:var allFiles = ftp.GetListing("/目标目录", ListOptions.FileList);借助FTP服务器原生命令过滤(更高效)
不用拉取全量文件列表,直接让FTP服务器返回符合时间条件的文件,减少网络传输。不同服务器命令不同:- Unix类FTP服务器(比如vsftpd):用
find命令直接筛选30天前的文件var commandResult = ftp.Execute("find /目标目录 -type f -mtime +30 -print"); // 解析commandResult.ResponseLines获取文件路径,再批量删除 - Windows IIS FTP服务器:用
DIR命令输出文件列表后解析日期var dirResult = ftp.Execute("DIR /A-D"); // /A-D表示只显示文件 // 遍历dirResult.ResponseLines,提取每个文件的修改日期和路径,筛选出符合条件的
- Unix类FTP服务器(比如vsftpd):用
批量删除减少交互次数
不管用哪种方式筛选出目标文件,都收集路径后用DeleteFiles批量删除,比逐个调用DeleteFile效率高很多:var cutoffDate = DateTime.Now.AddDays(-30); var filesToDelete = allFiles .Where(file => file.Modified < cutoffDate) .Select(file => file.FullName) .ToList(); if (filesToDelete.Any()) { ftp.DeleteFiles(filesToDelete); }注意时区匹配
FTP服务器的系统时间可能和本地时区不一致,比如服务器用UTC时间,本地是北京时间,记得把截止日期转成服务器时区的时间再判断:var cutoffUtc = DateTime.UtcNow.AddDays(-30); var filesToDelete = allFiles .Where(file => file.Modified.ToUniversalTime() < cutoffUtc) .Select(file => file.FullName) .ToList();
内容的提问来源于stack exchange,提问作者Venkat
相关产品推荐
相关产品推荐

