需求:最新项目需要,写个小功能,需求就是实时下载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上所有文件,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对网站的支持!
# ftpclient下载文件
# ftp
# 文件
# FTPClientHelper辅助类 实现文件上传
# 目录操作
# 下载等操作
# JAVA中使用FTPClient实现文件上传下载实例代码
# Java FTPClient实现文件上传下载
# Java FtpClient 实现文件上传服务
# Java中FTPClient上传中文目录、中文文件名乱码问题解决方法
# 递归
# 小编
# 才疏学浅
# 出了
# 夹中
# 在此
# 遍历
# 我把
# 第二个
# 给大家
# 中去
# 将此
# 先将
# 所述
# 两部分
# 带出
# 关键在于
# 要使
# 第一部分
# 给我留言
相关文章:
如何在阿里云通过域名搭建网站?
官网网站制作腾讯审核要多久,联想路由器newifi官网
建站上市公司网站建设方案与SEO优化服务定制指南
建站之星代理商如何保障技术支持与售后服务?
c++怎么使用类型萃取type_traits_c++ 模板元编程类型判断【方法】
mc皮肤壁纸制作器,苹果平板怎么设置自己想要的壁纸我的世界?
c++如何打印函数堆栈信息_c++ backtrace函数与符号名解析【方法】
台州网站建设制作公司,浙江手机无犯罪记录证明怎么开?
,柠檬视频怎样兑换vip?
免费的流程图制作网站有哪些,2025年教师初级职称申报网上流程?
建站之星多图banner生成与模板自定义指南
深圳网站制作费用多少钱,读秀,深圳文献港这样的网站很多只提供网上试读,但有些人只要提供试读的文章就能全篇下载,这个是怎么弄的?
如何快速生成专业多端适配建站电话?
建站之星在线版空间:自助建站+智能模板一键生成方案
郑州企业网站制作公司,郑州招聘网站有哪些?
建站之星如何实现五合一智能建站与营销推广?
如何在万网主机上快速搭建网站?
在线制作视频网站免费,都有哪些好的动漫网站?
如何在IIS7中新建站点?详细步骤解析
如何制作网站标识牌,动态网站如何制作(教程)?
Android滚轮选择时间控件使用详解
制作企业网站建设方案,怎样建设一个公司网站?
制作网站软件推荐手机版,如何制作属于自己的手机网站app应用?
如何在香港免费服务器上快速搭建网站?
如何在橙子建站中快速调整背景颜色?
青岛网站建设如何选择本地服务器?
如何正确选择百度移动适配建站域名?
建站之星云端配置指南:模板选择与SEO优化一键生成
如何快速生成橙子建站落地页链接?
网站设计制作书签怎么做,怎样将网页添加到书签/主页书签/桌面?
如何选择香港主机高效搭建外贸独立站?
专业网站制作企业网站,如何制作一个企业网站,建设网站的基本步骤有哪些?
建站之星后台管理系统如何操作?
建站之星代理费用多少?最新价格详情介绍
如何打造高效商业网站?建站目的决定转化率
网站制作费用多少钱,一个网站的运营,需要哪些费用?
建设网站制作价格,怎样建立自己的公司网站?
建站之星如何配置系统实现高效建站?
常州企业网站制作公司,全国继续教育网怎么登录?
成都网站制作公司哪家好,四川省职工服务网是做什么用?
建站之星如何防范黑客攻击与数据泄露?
如何用腾讯建站主机快速创建免费网站?
头像制作网站在线观看,除了站酷,还有哪些比较好的设计网站?
交易网站制作流程,我想开通一个网站,注册一个交易网址,需要那些手续?
如何用西部建站助手快速创建专业网站?
如何通过宝塔面板实现本地网站访问?
免费制作小说封面的网站有哪些,怎么接网站批量的封面单?
详解ASP.NET 生成二维码实例(采用ThoughtWorks.QRCode和QrCode.Net两种方式)
建站之星2.7模板:企业网站建设与h5定制设计专题
JS中使用new Date(str)创建时间对象不兼容firefox和ie的解决方法(两种)
*请认真填写需求信息,我们会在24小时内与您取得联系。