fileClient.listFiles()返回为null

  • Post author:
  • Post category:其他



fileClient.listFiles()返回为null不能获取文件目录,方法在最后。



问题描述:


最近在做一个磁盘清理的任务,就是定期去清理ftp中照片(SpringBoot项目)。遇到调用fileClient.listFiles()方法获取文件的子文件返回为null的情况。写需求的时候手里三个服务器都能正常读取文件目录,实现删除功能,自测的时候都通过了,结果流程走到测试那边,唯独一个平台不通过(该服务运行在三个不同平台)。拿回来测了又测在自己这边相同配置的服务器能可以实现功能。一步步的去Debug跟每个步骤每个传参都是相同的。可就是走到这个fileClient.listFiles()调用时返回空,一步步跟进去,传路径,匹配解码、正则匹配。估计要跟进去上千个步骤。一时痛苦无比,整整搞了两天没找到头绪。

  1. 整个过程代码和fileClient.listFiles()方法没有抛异常,没有报错。
  2. 两个服务器从mysql、ftp、tomcat等等能找到的配置都相同,可能有其他的不相同的,但是公司的服务器一个平台必然保持一样。
  3. 百度个各种方法都是无效的,甚至可以给你背出来他们的分析。


前人的问题分析

1.将ftp连接方式改为被动,

FTPClient.enterLocalPassiveMode();


理由:ftp连接分为指令连接、传输连接,指令连接的默认端口21(一般情况),传输连接的端口号在某一范围内随机产生。改为被动连接的目的是为了防止数据传输过程中发生端口号冲突。我是这么理解他们的理解。

没解决:难道这个不是配置中解决的吗?更何况这种冲突发生的情况也太小了吧?为什么我在这个服务器上一直出现?

2.common-net-3.3.jar和语言问题导致的

理由:说什么服务器语言是中文格式,无法解析中文命名的时间或clientConfig中配置的编码方式有问题。

没解决:jar包问题我我是真的很想去验证也验证了奈何公司maven库里面的common-net-3.3.2jar和common-net-3.6jar,我都试过了不行。然后就是编码问题,最起码的编码不说公司就是你自己加一个文件再自己电脑上如果是涉及项目会用中文?clientConfig里面的默认配置就是说的那种方式。


自己的尝试

  1. 比对服务器的差别。一个个的配置去看。最终没有发现差异。
  2. debug全程一直跟到match方法根据UNIX编码一个个去匹配character,比对了几百个步骤,整个解码过程都相同。可是还是分析不出差异。
    在这里插入图片描述
  3. 一度怀疑测试的服务器太垃圾不行,因为他们一直在用,我测试的时经常出现java IO Expection,当然这种情况是服务器问题。



问题的解决

fileClient.listFiles(path)传入的path前全部加 / 即ftp的绝对路径。这样不管什么服务器都可以解析出来。

下面分析一下:
相对路径

绝对路径

自己的本地调用这个方法连接服务器,并传入相对路径和绝对路径(这里是相对ftp服务器的),可以看出两中传参方法都可以解析出路径下的子目录。但是自己遇到问题的服务器就是百分之百的ftp相对路径无法解析子文件。

[root@CC vsftpd]# cd /opt/ftp
[root@CC ftp]# ls
test1  test2
[root@CC ftp]# cd /test1
-bash: cd: /test1: No such file or directory
[root@CC ftp]# cd test1
[root@CC test1]# pwd
/opt/ftp/test1

仔细看这里的脚本,当前目录是ftp下的test1目录,目录下还有子目录。

本地通过win命令行的方法连接我的服务器ftp通过相对路径和绝对路径都是可以访问

本地命令行

导致这种原因可能服务器的差异,ftp相对路径无法解析,所以后面的在使用路径的过程中尽量用绝对路径,但是也要避免出现,多加了”/“导致路径变成”//test1/1/2″的情况出现。

调bug不易。如果能够帮你解决问题,给个三联可好,哈哈。转载需著明谢谢。



版权声明:本文为qq_43389431原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。