零、引言

之前写FTP工具库,用的是ftp4j,他使用其他非常简单方便,但是在细节上提供的可选项比较少(当然也可能是我了解不够深刻)

最新的项目重写了FTP工具类,选择了apache net中的ftp库,选择apache的原因有如下几个:1是我相信apche 2是它的注释完善(apache的代码注释值得每一位程序猿学习) 3是提供的可选配置(FTPConfig)有跟多选择(比如主动被动模式,断点续传等)。

本人在使用ftp4j判定文件是否存在的时候,通过API(具体那个忘了)获取FTPFile对象时,在部分FTP服务时(filezilla)会遇到返回值为null的问题(备注:原因是时间格式化的问题),当时解决判定文件是否存在改用只通过获取文件名来解决。

本次改用apache net的时候,在使用API listFiles() 获取的也是null,经过详细查看源码,发现了一个API是 mlistFile() 这样获取结果OK。

一、Apache的mlistFile源码分析

源码如下:

    /*** Get file details using the MLST command** @param pathname the file or directory to list, may be {@code null}* @return the file details, may be {@code null}* @throws IOException on error* @since 3.0*/public FTPFile mlistFile(String pathname) throws IOException{boolean success = FTPReply.isPositiveCompletion(sendCommand(FTPCmd.MLST, pathname));if (success){ String reply = getReplyStrings()[1]; //5:check/* check the response makes sense.* Must have space before fact(s) and between fact(s) and filename* Fact(s) can be absent, so at least 3 chars are needed.*/if (reply.length() < 3 || reply.charAt(0) != ' ') {throw new MalformedServerReplyException("Invalid server reply (MLST): '" + reply + "'");}String entry = reply.substring(1); // skip leading space for parserreturn MLSxEntryParser.parseEntry(entry);} else {return null;}}

我看源码大概分析出了2点:

1. 此方法调用的是MLST,而listFile调用的是LIST。问题来了:什么是MLST??

2. 代码方法体第4行: String reply = getReplyStrings()[1]; 获取返回码其目的是为了判定FTP服务器是否支持MLST??有些FTPServer不支持?

二、什么是MLST(红色部分)

Older servers supports LIST command only for directory listing, this way the FTP client gets a non-userfriendly raw format for parsing, and only FTP clients knows what it meaning. Since the file timestamp based on the server timezone, it makes more different to doing FTP synchronize with folders and files because of there is no way to get current file timestamp in the server.
旧的服务对目录列表仅支持LIST命令,这样FTP客户端会获得一个非用户友好的待解析的原始格式,仅仅只有FTP客户端知道它的意义。由于文件的时间戳基于服务器的时区,它使得在FTP对目录和文件同步时有许多的不同,因为没有方法获得服务器上当前文件的时间戳。
For example there is a normally LIST format of raw directory:
-rw-r--r-- 1 user user 7080 Mar 9 05:24 faq.html
例如:这是对原始目录的普通LIST命令格式
-rw-r--r-- 1 user user 7080 Mar 9 05:24 faq.html
Is it readable for you?
是否可读呢?
The MLSD command provided by newer servers to gives users a standarded, detailed, readable directory listing, by sending MLSD command through FTP clients,the server returns accurate file information such as file create time, modified time, size and file owner. Since MLSD directory listing includes file modified time in UTC, so it's very useful for FTP client to converts remote file's timestamp to your Local time when synchronize folders. Also the MLST command could be used to get timestamp of single remote file only.
新的服务器提供的MLSD命令通过FTP客户端发送MLSD命令,服务器收集文件信息,如文件创建时间,修改时间,文件大小及文件所有用,向用户返回一个标准,详细且可读格式的目录列表。由于MLSD目录列表包含UTC格式的文件修改时间,因此这对于FTP客户端非常有用,当需要同步目录时,它可转换远程文件的时间戳到你的本地时间。同时,MLST命令也被用于获得单个远程文件的时间戳。

三、结尾

最近打王者有些沉迷,该反省。

学知识,做技术,不能不求甚解。

转载于:https://www.cnblogs.com/LiuChunfu/p/6804437.html

FTP中MLST概要解读---解决获取ftpFile为null的另外一种方式相关推荐

  1. spring @Value 获取配置文件为 null 常见的几种方式

    第一种方式: xx.properties 属性名称错误,未与@Value("${xxx}") 进行对应 第二种方式: 该类未注入到spring bean容器中 @Component ...

  2. OpenWrt 获取 WAN口 IPv4的IP 两种方式

    文章目录 OpenWrt 获取 WAN口 IPv4的IP 两种方式 前言 1.ifconfig获取 2.ubus获取 后话 OpenWrt 获取 WAN口 IPv4的IP 两种方式 前言 ssh连接到 ...

  3. datagridview后台获取选中行的值的几种方式

    1.双击datagridview中的一行,后台获取改行的一个或多个列 private void dgvImport_DoubleClick(object sender, EventArgs e){st ...

  4. 反射_获取字节码Class对象的三种方式

    * 获取Class对象的方式: 1. Class.forName("全类名"):将字节码文件加载进内存,返回Class对象     * 多用于配置文件,将类名定义在配置文件中.读取 ...

  5. C#获取本机IP地址的4种方式

    1.使用 Dns.GetHostEntry() 函数获取本地 IP 地址 Dns 类获取与 Internet 上的主机有关的信息.在 C# 中,Dns 类中有很多方法可以实现 DNS 相关功能.其中 ...

  6. Java通过图片url地址获取图片base64位字符串的两种方式

    工作中遇到通过图片的url获取图片base64位的需求.一开始是用网上的方法,通过工具类Toolkit,虽然实现的代码比较简短,不过偶尔会遇到图片转成base64位不正确的情况,至今不知道为啥. 之后 ...

  7. node.js 获取异步方法里面的数据 =》 两种方式

    第一种: 通过回调函数实现: var fs = require('fs); function getmime(callback){ fs.readFile('./t1.js', function(er ...

  8. Unity中传入任意数,转换成分,秒,并进行倒计时换算..(两种方式)

    第一种方式是利用Unity中的协程,代码如下: using System.Collections; using System.Collections.Generic; using UnityEngin ...

  9. Linux中vim编辑文件显示行号(临时和永久两种方式)

    一.前言   在Linux中经常使用vim编辑器去修改文件,默认是不显示行号的,那如何显示呢?有临时和永久两种方式.     本文由 @大白有点菜 原创,请勿盗用,转载请说明出处!如果觉得文章还不错, ...

最新文章

  1. CUDA刷新器:CUDA编程模型
  2. 计算机二级的考试c模板,2013年9月全国计算机等级《二级C++》上机模考试卷(5)
  3. windows server 2008R2 上安装配置freesshd
  4. c语言 amp 位与 什么意思,C语言中amp;是什么意思?--龙方网络
  5. platform设备驱动全透析
  6. 常用UI模板,loading框,提醒框,弹框确认框
  7. 想学IT的必看!深度解析跳槽从开始到结束完整流程万字长文!
  8. 每日一道剑指offer-替换空格
  9. 【背包问题】基于matlab量子免疫克隆算法求解背包问题【含Matlab源码 424期】
  10. 深度之眼 alexnet_AlexNet带给了深度学习的世界
  11. Web前端第三季(JavaScript):十二:第4章: 表单校验案例:401-开发注册表单页面+402-表单提交事件和获取html元素+403-完成用户名和邮箱的校验
  12. phpstudy配置sg11
  13. 前端基础——html5新增标签
  14. 关于书面辞职报告和试用期离职
  15. android 调用系统打印
  16. JAVA进行图片压缩
  17. Spinach和发牌姬
  18. UML建模-业务流程分析
  19. bat批处理循环执行adb命令,非科班面试之旅
  20. 计算机word操作试题,计算机一级Word操作题及答案

热门文章

  1. sublime text _注册码
  2. 《易经》中的64个人生智慧
  3. xml和对象之间的互相转换以及json和对象之间的互相转换
  4. EOJ 3346 皇后问题
  5. BUCK电源输出过冲怎么解决
  6. 记录智能车自制霍尔编码器(PCB篇)
  7. 分类模型的评价指标及实现(Python)
  8. websocket 从ip端口升级https域名模式
  9. 男孩子学机电一体化好还是计算机好,机电一体化是学什么的 毕业后有前途吗...
  10. word编辑技巧:查找替换中通配符应用