C# FTP 读取文件列表,大小,时间

代码:

cs 复制代码
using System;
using System.Collections.Generic;
using System.Globalization;
using System.IO;
using System.Net;
 
internal class FTPManager : Singleton<FTPManager>
{
    /// <summary>
    /// FTP 地址
    /// </summary>
    public string FtpUrl { get; set; }
    /// <summary>
    /// FTP 用户名
    /// </summary>
    public string FtpUser { get; set; }
    /// <summary>
    /// FTP 密码
    /// </summary>
    public string FtpPassword { get; set; }
 
    /// <summary>
    /// FTP 文件夹列表
    /// </summary>
    public List<string> FtpDirectoryList { get; private set; } = new List<string>();
    /// <summary>
    /// FTP 文件列表
    /// </summary>
    public List<FileInfo1> FtpFileList { get; private set; } = new List<FileInfo1>();
    /// <summary>
    /// 文件夹列表(临时)
    /// </summary>
    private Queue<string> DirectoryListTemporary { get; set; } = new Queue<string>();
 
    /// <summary>
    /// 读取文件
    /// </summary>
    public void Read()
    {
        if (string.IsNullOrEmpty(FtpUrl))
        {
            Console.WriteLine("请先读取配置文件");
            return;
        }
 
        Console.WriteLine("[GetAllFileList]开始读取 FTP 文件");
        FtpFileList.Clear();
        FtpDirectoryList.Clear();
        DirectoryListTemporary.Clear();
        GetFtpDirectoryList(FtpUrl);
        Console.WriteLine("[GetAllFileList]读取 FTP 文件完成");
    }
 
    /// <summary>
    /// 获取所有文件,文件夹,文件大小,修改时间,哈希值
    /// </summary>
    /// <param name="remoteFolderPath"></param>
    public void GetFtpDirectoryList(string url)
    {
        try
        {
            FtpWebRequest request = (FtpWebRequest)WebRequest.Create(url);
            request.Method = WebRequestMethods.Ftp.ListDirectoryDetails;
            request.Credentials = new NetworkCredential(FtpUser, FtpPassword);
            request.KeepAlive = true;
 
            using (FtpWebResponse response = (FtpWebResponse)request.GetResponse())
            using (StreamReader reader = new StreamReader(response.GetResponseStream()))
            {
                while (!reader.EndOfStream)
                {
                    string line = reader.ReadLine();
                    if (line == null) continue;
 
                    string[] parts = line.Split(new char[] { ' ', '\t' }, StringSplitOptions.RemoveEmptyEntries);
 
                    //注意:FTP 获取的时间中并没有秒数部分
 
                    //适用与 Microsoft IIS FTP 服务器,返回格式如下
                    //文件    "06-10-23    02:57PM    222720    CNCMain.exe"
                    //文件夹  "06-14-23    09:17AM    <DIR>    bin"
                    if (parts.Length == 4)
                    {
                        //文件夹
                        if (parts[2].Contains("<DIR>"))
                        {
                            string directoryName = line.Substring(line.LastIndexOf("<DIR>") + 5).Trim();
                            string path = $"{url}{directoryName}//";
 
                            FtpDirectoryList.Add(path);
                            DirectoryListTemporary.Enqueue(path);
                        }
                        //文件
                        else
                        {
                            string path = $"{url}{parts[3]}";
                            Console.WriteLine("正在读取:{0}", path);
 
                            long size = 0;
                            long.TryParse(parts[2], out size);
 
                            DateTime lastModified = DateTime.MinValue;
                            string dateString = string.Join(" ", parts[5], parts[6], parts[7]);
                            DateTime.TryParse(dateString, out lastModified);
 
                            var ftpFile = new FileInfo1();
                            ftpFile.Size = size;
                            ftpFile.FileName = parts[3];
                            ftpFile.FilePath = path;
                            ftpFile.LastWriteTime = lastModified;
                            FtpFileList.Add(ftpFile);
                        }
                    }
 
                    //适用于 UNIX/Linux FTP 服务器,格式如下
                    //文件     -rw-r--r-- 1 ftp ftp          17172 Apr 29 16:12 lang.txt
                    //文件夹   drwxr-xr-x 1 ftp ftp              0 Jun 17 10:46 Test1   
                    else if (parts.Length == 9)
                    {
                        string permission = parts[0];
                        //文件夹
                        if (permission.StartsWith("d"))
                        {
                            string directoryName = parts[8];
                            string path = $"{url}{directoryName}//";
 
                            FtpDirectoryList.Add(path);
                            DirectoryListTemporary.Enqueue(path);
                        }
                        //文件
                        else if (permission.StartsWith("-"))
                        {
                            string path = $"{url}{parts[8]}";
                            Console.WriteLine("正在读取:{0}", path);
 
                            long size = 0;
                            long.TryParse(parts[4], out size);
 
                            string datePart = string.Join(" ", parts[5], parts[6], parts[7]);
                            DateTime lastWriteTime = DateTime.MinValue;
                            if (parts[7].Contains(":"))
                            {
                                //日期格式:Jun 17 10:46   
                                lastWriteTime = DateTime.ParseExact(datePart, "MMM dd HH:mm", CultureInfo.InvariantCulture);
                            }
                            else
                            {
                                //如果是去年的文件,则为:Nov 16  2023
                                lastWriteTime = DateTime.ParseExact(datePart, "MMM dd yyyy", CultureInfo.InvariantCulture);
                            }
 
                            var ftpFile = new FileInfo1();
                            ftpFile.Size = size;
                            ftpFile.FileName = parts[8];
                            ftpFile.FilePath = path;
                            ftpFile.LastWriteTime = lastWriteTime;
                            FtpFileList.Add(ftpFile);
                        }
                    }
                }
            }
 
            if (DirectoryListTemporary.Count > 0)
                GetFtpDirectoryList(DirectoryListTemporary.Dequeue());
        }
        catch (Exception ex)
        {
            Console.WriteLine("读取 FTP 文件列表错误:{0}", ex.Message);
        }
    }
}

end

相关推荐
椒颜皮皮虾྅2 小时前
一套 C# 接口,解锁四类视觉任务:DeploySharp 分类、分割、关键点与旋转框实战
开发语言·分类·c#
罗迪尼亚的熔岩2 小时前
联合kuka机器人, 海康visonmaster 的手眼9点标定方法
机器人·c#·工业相机·标定
她说彩礼65万3 小时前
C# TaskCompletionSource
java·开发语言·c#
泛凡(Linyongui)19 小时前
基于 CW32L010 的智能厨卫调温旋钮方案--低成本 EC21 编码旋钮全解析
单片机·嵌入式硬件·c#
暴走约伯20 小时前
【VFX工具链源码拆解 02】告别机械劳动(上):一键统改百个子粒子颜色与批量重命名
3d·unity·c#·材质
信息安全失业大专人员1 天前
每日了解一个智能体-WorkBuddy
开发语言·ai·c#·智能体
呆呆敲代码的小Y1 天前
【实战精选面试题】C# 面试题详细解答,按难易程度排序
android·java·游戏·c#·游戏开发·unity面试题·c#面试题
淡海水1 天前
09-01-内存-Unity资源生命周期全景
unity·c#·游戏引擎·.netcore·gc
椒颜皮皮虾྅1 天前
让 C# 读懂整张图:DeploySharp 驱动 PaddleOCR v4/v5/v6,打通 OCR 全流程
开发语言·人工智能·深度学习·学习·c#·ocr·cuda
昂好的day1 天前
C# 同步异步与多线程:Thread / Task / 线程池一次讲透(上篇)
开发语言·windows·c#