Loading [MathJax]/jax/output/CommonHTML/config.js
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >问答首页 >用于解析WebRequestMethods.Ftp.ListDirectoryDetails FTP响应的C#类

用于解析WebRequestMethods.Ftp.ListDirectoryDetails FTP响应的C#类
EN

Stack Overflow用户
提问于 2011-08-15 01:37:02
回答 4查看 28.4K关注 0票数 21

我正在创建一个服务来监视FTP位置是否有新的更新,并且需要能够使用WebRequestMethods.Ftp.ListDirectoryDetails方法解析从FtpWebRequest响应返回的响应。如果所有响应都遵循相同的格式,这将是相当容易的,但不同的FTP服务器软件提供不同的响应格式。

例如,可以返回:

代码语言:javascript
运行
AI代码解释
复制
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

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

代码语言:javascript
运行
AI代码解释
复制
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#类可以无缝地处理这些情况?

我只需要列出包含以下详细信息的目录内容:文件/目录名、上次更新或创建的时间戳、文件/目录名。

预先感谢你的任何建议,Gavin

EN

回答 4

Stack Overflow用户

回答已采纳

发布于 2011-08-15 10:40:06

我遇到的一个解决方案是EdtFTPnet

EdtFTPnet似乎是一个很有特色的解决方案,可以处理很多不同的FTP选项,所以非常理想。

这是我在http://www.ftp2rss.com上使用的免费开源解决方案(这是我自己需要的一个小工具,但我觉得可能对其他人也有用)。

票数 4
EN

Stack Overflow用户

发布于 2016-09-29 13:04:33

对于第一个(DOS/Windows)清单,此代码将执行以下操作:

代码语言:javascript
运行
AI代码解释
复制
FtpWebRequest request = (FtpWebRequest)WebRequest.Create("ftp://ftp.example.com/");
request.Credentials = new NetworkCredential("user", "password");
request.Method = WebRequestMethods.Ftp.ListDirectoryDetails;
StreamReader reader = new StreamReader(request.GetResponse().GetResponseStream());

string pattern = @"^(\d+-\d+-\d+\s+\d+:\d+(?:AM|PM))\s+(<DIR>|\d+)\s+(.+)$";
Regex regex = new Regex(pattern);
IFormatProvider culture = CultureInfo.GetCultureInfo("en-us");
while (!reader.EndOfStream)
{
    string line = reader.ReadLine();
    Match match = regex.Match(line);
    string s = match.Groups[1].Value;
    DateTime modified =
        DateTime.ParseExact(s, "MM-dd-yy  hh:mmtt", culture, DateTimeStyles.None);
    s = match.Groups[2].Value;
    long size = (s != "<DIR>") ? long.Parse(s) : 0;
    string name = match.Groups[3].Value;

    Console.WriteLine(
        "{0,-16} size = {1,9}  modified = {2}",
        name, size, modified.ToString("yyyy-MM-dd HH:mm"));
}

您将获得:

代码语言:javascript
运行
AI代码解释
复制
Version2         size =         0  modified = 2011-08-10 12:02
image34.gif      size = 144700153  modified = 2009-06-25 14:41
updates.txt      size = 144700153  modified = 2009-06-25 14:51
digger.tif       size = 144700214  modified = 2010-11-04 14:45

有关其他(*nix)列表,请参见my answer to Parsing FtpWebRequest ListDirectoryDetails line

但是,实际上,尝试解析ListDirectoryDetails返回的列表并不是正确的方法。

您希望使用支持现代MLSD命令的FTP客户端,该命令以RFC 3659中指定的机器可读格式返回目录列表。在与不支持LIST命令的过时FTP服务器(如Microsoft IIS FTP服务器)交谈时,应将解析由古老的FTP命令(由FtpWebRequest内部用于其ListDirectoryDetails方法)返回的人类可读格式用作最后的手段。

例如,对于WinSCP .NET assembly,您可以使用它的Session.ListDirectorySession.EnumerateRemoteFiles方法。

它们在内部使用MLSD命令,但可以退回到LIST命令,并支持数十种不同的人类可读的列表格式。

返回的清单显示为具有以下属性的RemoteFileInfo instances集合:

  • Name
  • LastWriteTime (具有正确的timezone)
  • Length
  • FilePermissions (解析为单独的rights)
  • Group
  • Owner
  • IsDirectory
  • IsParentDirectory
  • IsThisDirectory

(我是WinSCP的作者)

大多数其他第三方库也会做同样的事情。出于此目的,使用FtpWebRequest class是不可靠的。不幸的是,在.NET框架中没有其他内置的FTP客户端。

票数 14
EN

Stack Overflow用户

发布于 2013-11-19 03:10:44

我也面临着同样的问题,并且使用正则表达式构建了一个简单的(尽管不是非常健壮的)解决方案,使用捕获组从每行中解析出相关信息:

代码语言:javascript
运行
AI代码解释
复制
public static Regex FtpListDirectoryDetailsRegex = new Regex(@".*(?<month>(Jan|Feb|Mar|Apr|May|Jun|Jul|Aug|Sep|Oct|Nov|Dec))\s*(?<day>[0-9]*)\s*(?<yearTime>([0-9]|:)*)\s*(?<fileName>.*)", RegexOptions.Compiled | RegexOptions.IgnoreCase);

然后,您可以通过以下方式从捕获组中提取值:

代码语言:javascript
运行
AI代码解释
复制
        string ftpResponse = "-r--r--r-- 1 ftp ftp              0 Nov 19 11:08 aaa.txt";
        Match match = FtpListDirectoryDetailsRegex.Match(ftpResponse);
        string month = match.Groups["month"].Value;
        string day = match.Groups["day"].Value;
        string yearTime = match.Groups["yearTime"].Value;
        string fileName = match.Groups["fileName"].Value;

需要注意的事项有:

  • 此选项仅适用于上述ftpResponse变量中所述格式的目录响应。在我的例子中,我很幸运每次只能访问相同的FTP服务器,所以响应格式不太可能改变。
  • yearTime变量可以表示文件时间戳的年份或时间。您需要通过查找冒号:字符的实例来手动解析它,冒号:字符将指示此捕获组包含时间而不是年份
票数 10
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/7060983

复制
相关文章
什么是DevOps?为什么我们需要DevOps?
传统IT技术团队中通常都有多个独立的组织-开发团队、测试团队和运维团队。开发团队进行软件开发、测试团队进行软件测试,运维团队致力于部署,负载平衡和发布管理。 他们之间的职能有时重叠、有时依赖、有时候会冲突。
字母哥博客
2020/09/23
8260
什么是DevOps?为什么我们需要DevOps?
为什么我们需要Pulsar?
随着互联网的高速发展,用户规模与业务并发量开始急剧增加,海量的请求需要接收和存储,业务需要中间件来实现削峰填谷;业务也在不断发展,企业内部的系统数量也在不断地增长,不同语言开发出来的系统需要统一的事件驱动;大数据、AI已经成为很多业务中不可或缺的技术,它们都需要统一的数据源。越来越多的场景离不开消息队列,稍具规模的业务,消息队列都是“标配”。
博文视点Broadview
2021/12/06
7310
为什么我们需要Pulsar?
我们为什么需要理论?
把设计当作建房子,理论就是盖房子的方法原理,只用沙石砖瓦,那很难盖好一座房子的,就别提一栋大厦了。如果知道了盖房子的方法,知道用多少材料,那么不仅事半功倍还能节省成本。
宇相
2018/09/18
2.8K0
我们为什么需要理论?
我们为什么需要SDN?
众所周知,相比发展迅速的计算机产业,网络产业的创新十分缓慢。每一个创新都需要等待数年才能完成技术标准化。为了解决这个问题,SDN创始人Nick McKeown教授对计算机产业的创新模式和网络产业的创新模式进行了研究和对比。在分析了计算机产业的创新模式之后,他总结出支撑计算机产业快速创新的如下三个因素。
博文视点Broadview
2020/06/11
9210
我们为什么需要SDN?
为什么我们需要Pod?
在前面的文章中,我详细介绍了在 Kubernetes 里部署一个应用的过程。在这些讲解中,我提到了这样一个知识点:Pod,是 Kubernetes 项目中最小的 API 对
yuanshuai
2022/08/17
4260
为什么我们需要Pod?
我们为什么需要MapReduce?
我们为什么不能使用数据库来对大量磁盘上的大规模数据进行批量分析呢?我们为什么要使用MapReduce? 这些问题的答案来自磁盘的另一个发展趋势: 寻址时间的提高远远慢于传输速率的提高。寻址是将磁头移动到特定磁盘位置进行读写操作的过程。它是导致磁盘操作延迟的主要原因,因而传输速率取决于磁盘的带宽。   如果数据的访问模式中包含大量的磁盘寻址,那么读取大量数据集所化的时间势必会更长(相较于流式数据读取模式),流式读取主要取决于传输速率。另一方面,如果数据库系统只更新一小部分记录,那么传统的B树更有优势。但数据库系统更新大部分数据时,B树的效率比MapReduce低得多,因为需要使用“排序/合并”来重建数据库。   许多情况下,可以将MapReduce视为关系型数据库管理系统的补充。两个系统之间的差异如下表所示。MapReduce比较适合以批处理的方式处理需要分析整个数据集的问题,尤其是即席分析。RDBMS(关系型数据库管理系统)适用于“点查询”和更新,数据集被索引后,数据库系统能够提供低延迟的数据检索和快速的少量数据更新。MapReduce适合一次写入,多次读取数据的应用,而 关系型数据库更适合持续更新的数据集。 关系型数据库和MapReduce的比较
MickyInvQ
2020/09/27
8470
我们为什么需要理论?
理论是指人们对自然、社会现象,按照已知的知识或者认知,经由一般化与演绎推理等方法,进行合乎逻辑的推论性总结。
宇相
2018/09/03
8770
我们为什么需要理论?
我们为什么需要CDP?
前面我们已经详细介绍过什么是CDP,不了解的同学可以往前翻一翻:3分钟告诉你什么是CDP系统!
博阳SCRM系统
2022/06/14
6110
我们为什么需要CDP?
什么是可编程代理,为什么我们需要它
人们经常问到的一个问题是:“什么是可编程代理,我们为什么需要它?”本文试图从不同的角度来回答这个问题。我们将从代理的简单定义开始,然后讨论代理在不同阶段是如何演化的,它们满足了哪些需求,以及它们在每个阶段提供了哪些好处。最后,我们将讨论可编程性的几个方面,并概述我们为什么需要可编程代理。
深度学习与Python
2022/06/13
3040
什么是可编程代理,为什么我们需要它
为什么我们需要 Hive Metastore!
IT 中的每个人都与数据打交道,包括前端和后端开发人员、分析师、QA 工程师、产品经理以及许多其他角色的人员。使用的数据和数据处理方法因角色而异,但数据本身往往不是关键。
Spark学习技巧
2023/03/21
6860
为什么我们需要 Hive Metastore!
为什么我们需要边缘计算?
08.16.18-Why-do-we-need-edge-computing-1068x656_副本.jpg
用户4122690
2020/04/06
6510
为什么我们需要边缘计算?
为什么我们需要企业架构?
胜兵先胜而后求战,败兵先战而后求胜 《孙子兵法·形篇》说到 “是故胜兵先胜而后求战,败兵先战而后求胜。”意谓胜利的军队总是先有了胜利的把握才寻求同敌人交战,失败的军队总是先同敌人交战而后企求侥幸取胜。指要充分做好战争准备,等有胜利的把握再打。如同行军打仗一般,企业信息化建设也是如此,如果没有做好未来的规划,那么最多只能得到局部的提升。 我们来看个例子: W公司这几年总共花了3千多万元在IT方面(构建了很多IT系统,比如ERP,订单管理,OA等等),初步感觉好像效果还不错。从表面看来,这样的企业大概可以算作信
ThoughtWorks
2022/08/26
5450
为什么我们需要企业架构?
为什么我们需要批量操作?
实习的时候被问过一个问题,为什么 redis 会有 pipline,mysql 会有 batch,这些东西都具有批量操作的共性,是什么原因让我们在处理数据时需要批量操作?
出其东门
2020/09/14
9190
为什么我们需要批量操作?
​CODING 2.0:为什么我们需要 DevOps
CODING 在前两天的 Kubecon 2019 大会上发布了 CODING 2.0。这背后是 CODING 对研发管理和研发团队组建的思考。从 CODING 成立以来,我们一直在探索“让开发更简单”的方式。把“让开发更简单”这个大愿景进行拆分,具体到可量化的产品目标上去,实际上是希望通过工具的形式,可以减轻开发过程中的重复劳动,提高软件交付的速度与质量。
腾讯云 CODING
2019/06/28
1.3K0
​CODING 2.0:为什么我们需要 DevOps
为什么我们需要多重回归?
考虑一种情况,其中许多不同的因素(称为预测变量或自变量)相互作用以确定结果(称为标准或因变量)。根据因素的不同,可能会取得不同的结果。例如,房屋销售价格(标准)可能由许多因素(预测因素)决定,如房屋位置、建造年份、当地住房市场状况、房屋状况等。
用户9972271
2022/09/06
3250
为什么我们需要区块链
“这个业务功能为什么要使用区块链来实现?使用数据库不是一样可以实现” 对于刚接触区块链的人来说,这是一个非常普遍的问题,下面我们就通过一个实例来对传统的数据库实现方式和区块链实现方式进行对比,之后我们
dys
2018/04/04
2.9K0
为什么我们需要区块链
观点:我们为什么需要威胁情报?
最近被谈论的异常火热的一个术语就是威胁情报,那么威胁情报到底是什么意思,它是一种什么概念或者机制呢?本文中我们就来亲密接触一下威胁情报,并了解它所具有的功能,然后给出几个威胁情报的最佳实践示例,最后分析威胁情报有助于SIEM解决什么问题。 什么是威胁情报? 最近,威胁情报受到广泛的关注。它有很多种不同的定义,下面列出了一些经常被引用的定义: 威胁情报是基于证据的知识,包括上下文、机制、指标、隐含和可操作的建议,针对一个现存的或新兴的威胁,可用于做出相应决定的知识。—Gartner 针对安全威胁、威胁者、
FB客服
2018/02/06
1.5K0
观点:我们为什么需要威胁情报?
Service Mesh 是什么,我们为什么需要它?
Service Mesh 是一个专门使服务与服务之间的通信变得安全、快速和可靠的的基础设施。如果你正在在构建一个云原生( Cloud Native )应用,那么你一定需要 Service Mesh 。
灵雀云
2019/07/30
1.7K0
Service Mesh 是什么,我们为什么需要它?
Service Mesh 是什么,我们为什么需要它?
Service Mesh 是一个专门使服务与服务之间的通信变得安全、快速和可靠的的基础设施。如果你正在在构建一个云原生( Cloud Native )应用,那么你一定需要 Service Mesh 。
PHP开发工程师
2021/05/29
7020
Service Mesh 是什么,我们为什么需要它?
为什么我们需要HTML5 WebSocket
    HTML5作为下一代的 Web 标准,它拥有许多引人注目的新特性,如 Canvas、本地存储、多媒体编程接口、WebSocket等等。这其中有“Web 的 TCP ”之称的WebSocket格外吸引开发人员的注意。WebSocket的出现使得浏览器提供对Socket的支持成为可能,从而在浏览器和服务器之间提供了一个基于TCP连接的双向通道。Web开发人员可以非常方便地使用WebSocket构建实时web应用,开发人员的手中从此又多了一柄神兵利器。
业余草
2019/01/21
8580
为什么我们需要HTML5 WebSocket

相似问题

什么是__i686.get_pc_thunk.bx?为什么我们需要这个电话?

22

为什么我们需要返回这个递归函数?

26

Python -为什么我们需要解开这个论点?

12

什么是OWASP?为什么我们需要它?

12

为什么这个Action<T>电话是合法的?

11
添加站长 进交流群

领取专属 10元无门槛券

AI混元助手 在线答疑

扫码加入开发者社群
关注 腾讯云开发者公众号

洞察 腾讯核心技术

剖析业界实践案例

扫码关注腾讯云开发者公众号
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档