时间:2021-05-19
需求:最新项目需要,写个小功能,需求就是实时下载ftp指定文件夹下的所有文件(包括子目录)到本地文件夹中,保留文件到目录路径不变。
分析:关键在于实时和下载并保持原目录。实时使用线程的定时调度完成,主要做后者,这显然要使用递归,但是ftp上的文件是不能直接得到相对路径的(恕我才疏学浅,并没有在FTPClient类中找到类似getPath()的方法),因此路径是要自己记录。总体思路有以下:
1、得到所有路径以及子路径:递归遍历所有文件到路径。参数:ftp为FTPClient对象,path为当前的路径,pathArray保存当前的路径,并将此路径集合带到主函数中去
getPath(ftp,path,pathArray); public static void getPath(FTPClient ftp,String path,ArrayList<String> pathArray) throws IOException{ FTPFile[] files = ftp.listFiles(); for (FTPFile ftpFile : files) { if(ftpFile.getName().equals(".")||ftpFile.getName().equals(".."))continue; if(ftpFile.isDirectory()){//如果是目录,则递归调用,查找里面所有文件 path+="/"+ftpFile.getName(); pathArray.add(path); ftp.changeWorkingDirectory(path);//改变当前路径 getPath(ftp,path,pathArray);//递归调用 path=path.substring(0, path.lastIndexOf("/"));//避免对之后的同目录下的路径构造作出干扰, } } }2、下载到指定的本地文件夹中,
download(ftp, pathArray, "c:\\download");程序之前出了写错误,为了排查,我把下载分成两部分,第一部分先将所有目录创建完成,在第二个for循环中进行文件的下载。参数:ftp为FTPClient,pathArray为1中带出的路径集合,后面一个String为本地路径
public static void download(FTPClient ftp,ArrayList<String> pathArray,String localRootPath) throws IOException{ for (String string : pathArray) { String localPath=localRootPath+string; File localFile = new File(localPath); if (!localFile.exists()) { localFile.mkdirs(); } } for (String string : pathArray) { String localPath=localRootPath+string;//构造本地路径 ftp.changeWorkingDirectory(string); FTPFile[] file=ftp.listFiles(); for (FTPFile ftpFile : file) { if(ftpFile.getName().equals(".")||ftpFile.getName().equals(".."))continue; File localFile = new File(localPath); if(!ftpFile.isDirectory()){ OutputStream is = new FileOutputStream(localFile+"/"+ftpFile.getName()); ftp.retrieveFile(ftpFile.getName(), is); is.close(); } } } }测试的主函数,使用的ftpClient为org.apache.commons.net.ftp.FTPClient:
public static void main(String[] args) throws SocketException, IOException { FTPClient ftp = new FTPClient(); ftp.connect("127.0.0.1"); ftp.login("test","test"); int reply; reply = ftp.getReplyCode(); if(!FTPReply.isPositiveCompletion(reply)) { ftp.disconnect(); System.err.println("FTP server refused connection."); System.exit(1); } ftp.setBufferSize(1024); ftp.setFileType(FTP.BINARY_FILE_TYPE); ftp.enterLocalPassiveMode(); String path=""; ArrayList<String> pathArray=new ArrayList<String>(); getPath(ftp,path,pathArray); System.out.println(pathArray); download(ftp, pathArray, "c:\\download"); ftp.logout(); ftp.disconnect(); }以上所述是小编给大家介绍的使用ftpClient下载ftp上所有文件,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对网站的支持!
声明:本页内容来源网络,仅供用户参考;我单位不保证亦不表示资料全面及准确无误,也不保证亦不表示这些资料为最新信息,如因任何原因,本网内容或者用户因倚赖本网内容造成任何损失或损害,我单位将不会负任何法律责任。如涉及版权问题,请提交至online#300.cn邮箱联系删除。
今天被ftp上中文名修改坑了好久项目用的是apachecommons里的FtpClient实现的对ftp文件的上传下载操作,今天增加了业务要修改ftp上的文件名
本代码以下载FTP服务器上某个目录下的所有文件为例。如果需要下载某个目录下的.txt类型的所有文件,请把mget*.*改成mget*.txt如果需要下载某个目录
最近在写一个FTP上传工具,用到了Apache的FTPClient,但是每个线程频繁的创建和销毁FTPClient对象对服务器的压力很大,因此,此处最好使用一个
FTP-文件传输协议。用于互联网双向传输,控制文件下载空间在服务器复制文件从本地计算机或本地上传文件复制到服务器上的空间。使用FTP进行传输,FTP需要先创建账
python从ftp上下载文件的方法:首先导入ftp模块;然后使用【chdir】命令切换工作路径;再使用“self.ftp.nlst()”命令获取目录下的文件;