从 FTP 服务器下载文件的功能,并且支持根据文件名称的前缀或直接文件名进行查找和下载。以下是对代码的一些建议和修改,以确保它能够满足您的需求,尤其是如果您希望仅下载特定类型的文件(例如 .csv
文件)
using System;
using System.Collections.Generic;
using System.IO;
using System.Linq;
using System.Net;
namespace Drv.Client
{
public partial class FtpClient
{
private static readonly object lockObject = new object();
/// <summary>
/// 下载特定前缀或特定文件名的文件(支持筛选文件类型)
/// </summary>
/// <param name="ftpUrl"></param>
/// <param name="username"></param>
/// <param name="password"></param>
/// <param name="filePrefix"></param>
/// <param name="lastModifiedTime"></param>
/// <param name="extension">需要下载的文件扩展名(例如 ".csv")</param>
/// <returns></returns>
public static string DownloadFileFromFtp(
string ftpUrl,
string username,
string password,
string filePrefix,
ref DateTime lastModifiedTime,
string extension = ".csv")
{
try
{
lock (lockObject)
{
// 列出文件
List<string> files = ListFilesOnFtp(ftpUrl, username, password);
foreach (var file in files)
{
// 检查文件名是否以指定前缀和扩展名结尾
if (file.StartsWith(filePrefix, StringComparison.OrdinalIgnoreCase) && file.EndsWith(extension, StringComparison.OrdinalIgnoreCase))
{
string fileUrl = ftpUrl + "/" + file; // 确保文件URL正确
FtpWebRequest request = CreateFtpRequest(fileUrl, username, password, WebRequestMethods.Ftp.GetDateTimestamp);
// 获取最后修改时间
DateTime serverLastModifiedTime;
using (FtpWebResponse response = (FtpWebResponse)request.GetResponse())
{
serverLastModifiedTime = response.LastModified;
}
// 比较最后修改时间
if (serverLastModifiedTime > lastModifiedTime)
{
lastModifiedTime = serverLastModifiedTime;
// 下载文件内容
request = CreateFtpRequest(fileUrl, username, password, WebRequestMethods.Ftp.DownloadFile);
using (FtpWebResponse response = (FtpWebResponse)request.GetResponse())
using (Stream responseStream = response.GetResponseStream())
using (StreamReader reader = new StreamReader(responseStream))
{
return reader.ReadToEnd(); // 读取并返回文件内容
}
}
else
{
_logger.LogInfo($"The file {file} is not modified since the last download.");
}
}
}
return string.Empty; // 如果没有文件符合条件
}
}
catch (WebException ex)
{
// 处理 FTP 相关的异常
if (ex.Response is FtpWebResponse ftpResponse)
{
_logger.LogError($"FTP Error: {ftpResponse.StatusDescription}");
}
else
{
_logger.LogError($"Network Error: {ex.Message}");
}
return string.Empty;
}
}
private static List<string> ListFilesOnFtp(string ftpUrl, string username, string password)
{
List<string> fileList = new List<string>();
FtpWebRequest request = CreateFtpRequest(ftpUrl, username, password, WebRequestMethods.Ftp.ListDirectory);
using (FtpWebResponse response = (FtpWebResponse)request.GetResponse())
using (Stream responseStream = response.GetResponseStream())
using (StreamReader reader = new StreamReader(responseStream))
{
while (!reader.EndOfStream)
{
fileList.Add(reader.ReadLine());
}
}
return fileList;
}
private static FtpWebRequest CreateFtpRequest(string ftpUrl, string username, string password, string method)
{
FtpWebRequest request = (FtpWebRequest)WebRequest.Create(ftpUrl);
request.Method = method;
if (!string.IsNullOrEmpty(username) && !string.IsNullOrEmpty(password))
{
request.Credentials = new NetworkCredential(username, password);
}
return request;
}
}
}