搞个遍历多FTP地址查文件的程序
前言
我们有这样一个场景,就是业务那边会用高拍仪,拍各种票。然后生成pdf的影像件,最后影像件放到FTP服务器里做归档管理。
这个影像件每天都很多,每天有,所以就导致FTP文件非常非常的多。
存到是还好,可是当要找某个文件的时候,就会很麻烦。
FTP本身无法实现全盘检索,只能在目录文件夹里,去检索文件。
也就是说,当我不确定文件在哪个文件夹,只是知道一个文件名字,找到他就非常非常的难受了……
之前这种情况,我都是联系后台同事,帮忙在FTP的服务器上,在服务器上进行全盘检索。
但是每次都这么做,就很不好,因为毕竟经常麻烦别人很不好。
所以我决定,研究出一个查询的程序~🧐🧐
设计
查了查资料,python有一个支持FTP的库——ftplib。
我简单测试了下,大概知道咋用了。
计划大概的思路呢,
维护一个外部的配置文件,在里面放入多个FTP地址,以及账密。
程序呢,入参为要找的文件名字,
遍历每个FTP地址,每个FTP里,遍历所有的子文件夹及子子文件夹,去里面匹配文件名。
找到后,即将文件copy到本地。未找到,则记录不存在。
同时增加一个log文件,去记录搜寻的信息。
嗯,开工~🤠🤠
实现
这个逻辑呀,有一个很绕的地方,就是文件夹的层级不规则,路径不规则。
我开始没想到竟然这么不规则……
比如,有这样的路径:
也有这样的:
还有这样的:
这样的:
所以开始我一直没想明白我要怎么去写循环,因为ftp里没有类似于tree的功能,必须进入一个路径,ftp.nlst()才能知道子文件夹有哪些。
也就是说,我要不停的进路径,获取子地址,再进子地址,获取新的子地址……
另外,目前ftplib库的用法里,无法区分出来文件和文件夹。
也就是说,我必须要进入到每个文件夹里,获取所有子项,然后再进入,能进入的,就是文件夹,无法进入的,就是文件。只能通过这个逻辑去判断文件。
后续
真的这个代码,写的贼累……
因为例外的情况实在是太多太多了。
基本上写完,测试,发现其他情况没考虑到……增加逻辑,写完,测试,又发现新的情况出现了……
真的写的贼累,而且我感觉大脑起飞了,为了简化代码,完善逻辑,各种循环和判断,
嗯,不过最后还是写出来了呢……
代码打算单独再找时间写进来,还有一些逻辑的说明。
参考
FTP的处理,主要用到了ftplib
这个库。
官方使用参考:ftplib — FTP 协议客户端
遇到的一个问题
这个呢,我必须写进来!
我查资料的时候,抓取ftp文件及文件夹,可以使用一个FTP.mlsd()
的方法。通过它可以做些判断,判断抓取到的content是文件夹还是文件。
我开始也没细研究它,就是照着用,结果一直报错一直报错……我就各种翻查资料看是不是我写法不对,又甚至找资料把这个方法的说明都仔细学习了一遍……然后各种测试,就还是不ok。
做了各种分析,然后查报错,终于最后发现,mlsd的方法,不是所有FTP服务器都支持的…特别是IIS发布的,不支持……而我要连的FTP服务还真真就是IIS发布出来的……简直让我大无语呀……
所以我一定要把这个记下来!可能做完这个程序,我就一段时间不会鼓捣ftp的事情了,但是这个让我痛彻心扉的问题,要记住。
🤔🤔🤔🤔🤔🤔🤔
测试了好多场景,然后其中的一个报错:
也是查这个报错的资料,终于发现了个靠谱的答复:
ftplib MLSD command gives 500 Unknown command
又遇到的问题
因为我程序设计的场景是只知道文件名去遍历查找,但是实际执行时发现,由于FTP地址里的项目实在是太多太多太多了,遍历一遍要跑非常非常非常的久……我测试去找了一个很深层级的文件夹里的文件,结果跑了将近3h,还没找到它,FTP Server就给我强制关闭连接了……
这我是万万没想到的呀……
这到底是多少的子项目呀,跑了这么久还没跑完……最后还被ftp服务踢出来了……
😱😱😱😱😱😱😱
后来呢,我又在晚上跑了一次,这次成功了,找到文件之前,扫描到了350356
个项目(基本上99%应该都是文件),耗时7小时47分钟……
我真的要裂开了😳😳😳
但是呢,此时程序还没有完全把FTP的内容遍历完毕。也就是说,实际的文件数是更多。
这个呢,我想了想,还是做成查询了比如10000个子项目后,就关闭FTP连接,然后再登录进去,接着查询的方式。防止服务器终止访问,可能更保险一点。
最后终于还是写出来了。
我最后测试了一下搜索一个不存在的文件,
程序逻辑里,会将FTP遍历完,找不到最后就print不存在文件。于是,就把所有的文件遍历到了……
由于我重新调整了逻辑,这次遍历全盘的时间竟然才2h。不过,最后计的文件数约是208W
……🤣🤣🤣🤣🤣🤣
我真的服了自己了,竟然又给自己搞了这么一个大坑的事情去做。