c#从ftp服务器下载文件读取csv

从 FTP 服务器下载文件的功能,并且支持根据文件名称的前缀或直接文件名进行查找和下载。以下是对代码的一些建议和修改,以确保它能够满足您的需求,尤其是如果您希望仅下载特定类型的文件(例如 .csv 文件)

cs 复制代码
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;
        }
    }
}
相关推荐
北域码匠6 小时前
高通滤波算法深度解析(High-Pass Filter)
stm32·算法·c#·数字信号处理·嵌入式开发·滤波算法·高通滤波
rockey6278 小时前
C#脚本引擎之AScript与Z.Expressions.Eval对比
c#·.net·script·expression·动态脚本
天下无敌笨笨熊11 小时前
C#Modbus串口开发心得
开发语言·c#
CSDN_RTKLIB11 小时前
const与readonly关键字
c#
leonkay12 小时前
C# 锁机制——【2】深入原理
开发语言·后端·spring·c#·个人开发
geovindu16 小时前
CSharp: Wordcloud
开发语言·后端·c#·.net·.netcore·词云
geovindu17 小时前
CSharp: Command Pattern
开发语言·后端·c#·.net·.netcore·命令模式·行为模式
格林威20 小时前
C# 相机图像阴影校正:使用OpenCvSharp实现工业相机阴影平场校正功能
人工智能·数码相机·opencv·计算机视觉·c#·机器视觉·工业相机
俊昭喜喜里21 小时前
c#中的构造函数
开发语言·数据库·c#
hahaha601621 小时前
HLS高层次综合设计--axi之burst纠偏
开发语言·算法·fpga开发·c#