点晴MIS内部交流论坛加入收藏
新手上路
论坛搜索
 您的位置:点晴MIS系统问题答疑『 技术文档交流 』浏览当前帖子  
登 陆注 册论坛帮助  

  网站搜索
  搜索范围: 搜索方式: 关键词(可用空格分开)  

  作者及文章信息: 本文热度:2956 % 
admin

积分:73026
等级:网站管理员
文数:13445
注册:2004-7-20

 信息   留言   主页   编辑   引用    

楼 顶 

 【C#】类来解析WebRequestMethods.Ftp.ListDirectoryDe​​tails


WebRequestMethods.Ftp.ListDirectoryDetails方法解析从FtpWebRequest响应返回的响应。如果所有响应都遵循相同的格式,则很容易,但是不同的FTP服务器软件提供不同的响应格式。

例如,一台服务器可能返回:

08-10-11 12:02PM <DIR> Version2

06-25-09 02:41PM 144700153 image34.gif

06-25-09 02:51PM 144700153 updates.txt

11-04-10 02:45PM 144700214 digger.tif

另一台服务器可能会返回:

d--x--x--x 2 ftp ftp 4096 Mar 07 2002 bin

-rw-r--r-- 1 ftp ftp 659450 Jun 15 05:07 TEST.TXT

-rw-r--r-- 1 ftp ftp 101786380 Sep 08 2008 TEST03-05.TXT

drwxrwxr-x 2 ftp ftp 4096 May 06 12:24 dropoff

而且还观察到其他差异,因此可能存在许多我尚未遇到的细微差异。

是否有人知道可以无缝处理这些情况的完全托管(不需要在Windows上访问外部dll)的C#类?

我只需要列出具有以下详细信息的目录内容:文件/目录名称,最近更新或创建的时间戳,文件/目录名称。


该文章在 2021/9/1 9:26:53 编辑过

  离 线  2021/9/1 9:06:15 

admin

积分:73026
等级:网站管理员
文数:13445
注册:2004-7-20

 信息   留言   主页   编辑   引用

A9楼 
 


public static string FTPRegexDir = @"\s*(?<size>[0-9]*)\s*(?<month>(Jan|Feb|Mar|Apr|May|Jun|Jul|Aug|Sep|Oct|Nov|Dec))\s*(?<day>[0-9]*)\s*(?<yearTime>([0-9]|:)*)\s*(?<fileName>.*)";          //FTP解析正则字串
public static string FTPRegexDD = @"^(\d+-\d+-\d+\s+\d+:\d+(?:AM|PM))\s+(<DIR>|\d+)\s+(.+)$";  //FTP解析正则字串

/// <summary>
/// 获取当前目录下的目录及文件
/// </summary>
/// param name="ftpfileList"></param>
/// <param name="dirName"></param>
/// <returns></returns>
public static List<ActFile> GetFtpFile(string dirName, int ilevel = 0)
{
    var ftpfileList = new List<ActFile>();
    return MethodInvoke($@"GetFtpFile({dirName})", () =>
    {
        string tempDir = dirName;
        tempDir = tempDir.Replace("//", "/");
        if (Data.Left(tempDir, 1) == "/") { tempDir = Data.Right(tempDir, tempDir.Length - 1); }
        if (Data.Right(tempDir, 1) == "/") { tempDir = Data.Left(tempDir, tempDir.Length - 1); }
        string url = "ftp://" + ftpHostIP + ":" + ftpHostPort + "/"+ tempDir;
        try
        {
            FtpWebRequest ftpRequest = (FtpWebRequest)WebRequest.Create(new Uri(url));
            ftpRequest.UseBinary = true;
            ftpRequest.Credentials = new NetworkCredential(username, password);
            ftpRequest.Method = WebRequestMethods.Ftp.ListDirectoryDetails;//该方法可以得到文件名称的详细资源
            StreamReader ftpFileListReader = new StreamReader(ftpRequest.GetResponse().GetResponseStream(), Encoding.UTF8);
            while (!ftpFileListReader.EndOfStream)
            {
                string line = ftpFileListReader.ReadLine();
                string firstChr = Data.Left(line, 1);
                string fileSize = "";
                string fileName = "";
                bool isDirTemp = false;
                if (firstChr == "d" || firstChr == "-")
                {
                    Regex FtpListDirDetailsRegex = new Regex(FTPRegexDir, RegexOptions.Compiled | RegexOptions.IgnoreCase);
                    Match match = FtpListDirDetailsRegex.Match(line);
                    fileSize = match.Groups["size"].Value;
                    fileName = match.Groups["fileName"].Value;
                }
                else
                {
                    Regex FtpListDirDetailsRegex = new Regex(FTPRegexDD, RegexOptions.Compiled | RegexOptions.IgnoreCase);
                    Match match = FtpListDirDetailsRegex.Match(line);
                    fileSize = match.Groups[2].Value;
                    fileName = match.Groups[3].Value;
                }
                if (firstChr == "d" || line.IndexOf("<DIR>") > -1)
                {
                    fileSize = "0";
                    isDirTemp = true;
                }
                ftpfileList.Add(new ActFile { isDir = isDirTemp, name = fileName, path = "/" + tempDir, level = ilevel, size = fileSize, lineStr = line });
            }
            ftpFileListReader.Close();
        }
        catch (Exception ex)
        {
            ftpfileList.Add(new ActFile { isDir = true, name = "", path = "/" + tempDir, level = ilevel, size = "0", lineStr = "FTP连接错误,错误原因:" + Environment.NewLine + ex.Message });
        }
        return ftpfileList;
    });
}

该文章在 2021/9/1 15:47:14 编辑过

  离 线  2021/9/1 9:20:27 
  本文章共有 1 页, 1 张回文,每页有 10 张回文 >> [ 1 ]
页码:

Copyright 2003-2022 ClickSun All Rights Reserved