使用ftpClient下载ftp上所有文件解析

发布时间 - 2026-01-11 00:47:43    点击率:

需求:最新项目需要,写个小功能,需求就是实时下载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上传中文目录、中文文件名乱码问题解决方法  # 递归  # 小编  # 才疏学浅  # 出了  # 夹中  # 在此  # 遍历  # 我把  # 第二个  # 给大家  # 中去  # 将此  # 先将  # 所述  # 两部分  # 带出  # 关键在于  # 要使  # 第一部分  # 给我留言 


相关栏目: 【 网站优化151355 】 【 网络推广146373 】 【 网络技术251813 】 【 AI营销90571


相关推荐: Laravel如何实现多语言支持_Laravel本地化与国际化(i18n)配置教程  清除minerd进程的简单方法  如何快速建站并高效导出源代码?  Python企业级消息系统教程_KafkaRabbitMQ高并发应用  Laravel怎么生成URL_Laravel路由命名与URL生成函数详解  香港服务器部署网站为何提示未备案?  如何在Windows 2008云服务器安全搭建网站?  Laravel怎么集成Log日志记录_Laravel单文件与每日日志配置及自定义通道【详解】  千库网官网入口推荐 千库网设计创意平台入口  网站广告牌制作方法,街上的广告牌,横幅,用PS还是其他软件做的?  如何破解联通资金短缺导致的基站建设难题?  怎么用AI帮你设计一套个性化的手机App图标?  HTML透明颜色代码在Angular里怎么设置_Angular透明颜色使用指南【详解】  如何登录建站主机?访问步骤全解析  北京企业网站设计制作公司,北京铁路集团官方网站?  Laravel如何获取当前登录用户信息_Laravel Auth门面使用与Session用户读取【技巧】  JS中对数组元素进行增删改移的方法总结  香港服务器网站测试全流程:性能评估、SEO加载与移动适配优化  个人网站制作流程图片大全,个人网站如何注销?  深圳网站制作公司好吗,在深圳找工作哪个网站最好啊?  Edge浏览器怎么启用睡眠标签页_节省电脑内存占用优化技巧  Windows10怎样连接蓝牙设备_Windows10蓝牙连接步骤【教程】  大连网站制作公司哪家好一点,大连买房网站哪个好?  Laravel怎么定时执行任务_Laravel任务调度器Schedule配置与Cron设置【教程】  如何在阿里云ECS服务器部署织梦CMS网站?  Windows10如何删除恢复分区_Win10 Diskpart命令强制删除分区  JavaScript如何实现类型判断_typeof和instanceof有什么区别  大连网站制作费用,大连新青年网站,五年四班里的视频怎样下载啊?  Gemini怎么用新功能实时问答_Gemini实时问答使用【步骤】  JavaScript如何实现音频处理_Web Audio API如何工作?  Windows10电脑怎么设置虚拟光驱_Win10右键装载ISO镜像文件  如何用景安虚拟主机手机版绑定域名建站?  Laravel如何使用Vite进行前端资源打包?(配置示例)  Laravel怎么多语言本地化设置_Laravel语言包翻译与Locale动态切换【手册】  Laravel Seeder填充数据教程_Laravel模型工厂Factory使用  jquery插件bootstrapValidator表单验证详解  Laravel怎么实现软删除SoftDeletes_Laravel模型回收站功能与数据恢复【步骤】  如何获取免费开源的自助建站系统源码?  jQuery中的100个技巧汇总  Laravel如何设置自定义的日志文件名_Laravel根据日期或用户ID生成动态日志【技巧】  Win11怎么关闭透明效果_Windows11辅助功能视觉效果设置  通义万相免费版怎么用_通义万相免费版使用方法详细指南【教程】  高端建站如何打造兼具美学与转化的品牌官网?  大连企业网站制作公司,大连2025企业社保缴费网上缴费流程?  laravel怎么用DB facade执行原生SQL查询_laravel DB facade原生SQL执行方法  制作网站软件推荐手机版,如何制作属于自己的手机网站app应用?  Midjourney怎样加参数调细节_Midjourney参数调整技巧【指南】  微信小程序 配置文件详细介绍  Laravel如何处理CORS跨域请求?(配置示例)  如何在七牛云存储上搭建网站并设置自定义域名?