依赖

<dependency><groupId>commons-net</groupId><artifactId>commons-net</artifactId><version>3.4</version></dependency><dependency><groupId>org.apache.commons</groupId><artifactId>commons-lang3</artifactId><version>3.3.2</version></dependency>

节点对象

package per.qiao.utils.ftp;/*** Create by IntelliJ Idea 2018.2** @author: qyp* Date: 2019-07-19 22:14*/import lombok.Data;import java.util.List;@Data
public class Node {private enum TYPE {DIR("DIR"),FILE("FILE");private String type;private TYPE(String type) {this.type = type;}public String getType() {return this.type;}}private String id;private String name;private String path;private TYPE type;private List<Node> childList;private Node() {}private Node(String id, String name, String path, TYPE type) {this.id = id;this.name = name;this.path = path;this.type = type;}public static Node getDirNode(String id, String name, String path) {return new Node(id, name, path, TYPE.DIR);}public static Node getFileNode(String id, String name, String path) {return new Node(id, name, path, TYPE.FILE);}
}

生成节点目录树结构

package per.qiao.utils.ftp;import org.apache.commons.lang3.StringUtils;
import org.apache.commons.net.ftp.FTPClient;
import org.apache.commons.net.ftp.FTPFile;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;import java.io.File;
import java.io.IOException;
import java.util.ArrayList;
import java.util.List;
import java.util.UUID;/*** Create by IntelliJ Idea 2018.2** @author: qyp* Date: 2019-07-19 21:27*/public class FtpUtils {private final static Logger logger = LoggerFactory.getLogger(FtpUtils.class);/*** 本地连接* @return*/public static FTPClient localConn() {String server = "127.0.0.1";int port = 21;String username = "test";String password = "test";
//        path = "/FTPStation/";FTPClient ftpClient = null;try {ftpClient = connectServer(server, port, username, password, "/");} catch (IOException e) {e.printStackTrace();}return ftpClient;}/**** @param server* @param port* @param username* @param password* @param path 连接的节点(相对根路径的文件夹)* @return*/public static FTPClient connectServer(String server, int port, String username, String password, String path) throws IOException {path = path == null ? "" : path;FTPClient ftp = new FTPClient();//下面四行代码必须要,而且不能改变编码格式,否则不能正确下载中文文件// 如果使用serv-u发布ftp站点,则需要勾掉“高级选项”中的“对所有已收发的路径和文件名使用UTF-8编码”ftp.setControlEncoding("GBK");FTPClientConfig conf = new FTPClientConfig(FTPClientConfig.SYST_NT);conf.setServerLanguageCode("zh");ftp.configure(conf);// 判断ftp是否存在ftp.connect(server, port);ftp.setDataTimeout(2 * 60 * 1000);if (!FTPReply.isPositiveCompletion(ftp.getReplyCode())) {ftp.disconnect();System.out.println(server + "拒绝连接");}//登陆ftpboolean login = ftp.login(username, password);if (logger.isDebugEnabled()) {if (login) {logger.debug("登陆FTP成功! ip: " + server);} else {logger.debug("登陆FTP失败! ip: " + server);}}//根据输入的路径,切换工作目录。这样ftp端的路径就可以使用相对路径了exchageDir(path, ftp);return ftp;}/*** 切换目录 返回切换的层级数* @param path* @param ftp* @return 切换的层级数* @throws IOException*/private static int exchageDir(String path, FTPClient ftp) {// 切换的次数(层级),方便回退int level = 0;try {if (StringUtils.isNotBlank(path)) {// 对路径按照 '/' 进行切割,一层一层的进入String[] pathes = path.split("/");for (String onepath : pathes) {if (onepath == null || "".equals(onepath.trim())) {continue;}//文件排除if (onepath.contains(".")) {continue;}boolean flagDir = ftp.changeWorkingDirectory(onepath);if (flagDir) {level ++;logger.info("成功连接ftp目录:" + ftp.printWorkingDirectory());} else {logger.warn("连接ftp目录失败:" + ftp.printWorkingDirectory());}}}} catch (IOException e) {logger.error("切换失败, 路径不存在");e.printStackTrace();throw new IllegalArgumentException("切换失败, 路径不存在");}return level;}/*** 生成目录树* @return*/public static Node getTree(String path) {FTPClient ftp = localConn();exchageDir(path, ftp);String rootNodeName = path.substring(path.lastIndexOf("/") + 1);Node rootNode = Node.getDirNode(getId(), rootNodeName, path);listTree(ftp, path, rootNode);return rootNode;}/*** 遍历树结构* @param ftp* @param rootPath* @param parentNode*/private static void listTree(FTPClient ftp, String rootPath, Node parentNode) {try {FTPFile[] ftpFiles = ftp.listFiles();if (ftpFiles.length <= 0) {return;}for (FTPFile f : ftpFiles) {List<Node> childList = parentNode.getChildList();if (childList == null) {childList = new ArrayList<>();parentNode.setChildList(childList);}Node currentNode = null;if (f.isDirectory()) {currentNode = Node.getDirNode(getId(), f.getName(), rootPath + File.separator + f.getName());if (ftp.changeWorkingDirectory(f.getName()) ) {if (logger.isDebugEnabled()) {logger.debug("进入:", ftp.printWorkingDirectory());}listTree(ftp, rootPath + File.separator + f.getName(), currentNode);}ftp.changeToParentDirectory();if (logger.isDebugEnabled()) {logger.debug("退出: {}", ftp.printWorkingDirectory());}} else {currentNode = Node.getFileNode(getId(), f.getName(), rootPath + File.separator + f.getName());}childList.add(currentNode);}} catch (IOException e) {e.printStackTrace();logger.error("路径不存在");}}private static String getId() {return UUID.randomUUID().toString().replaceAll("-", "");}public static void main(String[] args) {Node rootNode = getTree("/CAD/第一层");System.out.println(rootNode);}}

转载于:https://www.cnblogs.com/qiaozhuangshi/p/11216455.html

生成ftp文件的目录树相关推荐

  1. python指定目录_python生成指定文件夹目录树

    # -*- coding: utf-8 -*- import sys from pathlib import Path class DirectionTree(object): "" ...

  2. C#学习基本概念---xcopy(复制文件和目录树)

    XCOPY是COPY的扩展,可以把指定的目录连文件和目录结构一并拷贝,但不能拷贝系统文件:使用时源盘符.源目标路径名.源文件名至少指定一个:选用/S时对源目录下及其子目录下的所有文件进行COPY.除非 ...

  3. c语言复制文件夹xcopy,C#学习基本概念---xcopy(复制文件和目录树)

    XCOPY是COPY的扩展,可以把指定的目录连文件和目录结构一并拷贝,但不能拷贝系统文件:使用时源盘符.源目标路径名.源文件名至少指定一个:选用/S时对源目录下及其子目录下的所有文件进行COPY.除非 ...

  4. bat文件打开一闪就没了_window文件夹目录树的创建

    问题描述 当我们的项目文件夹逐渐丰满,各类文件种类繁多,为了增强项目资料的自明性,便于资料管理和交接,有必要对项目文件进行汇总说明. 要进行文件汇总,首先要提取文件的目录树. 什么是目录树呢?在cmd ...

  5. java查找目录文件函数_java 实现 文件操作工具集。包括文件、目录树的拷贝、删除、移动、查找等工具函数...

    import java.io.*; /** * 文件操作工具集.包括文件.目录树的拷贝.删除.移动.查找等工具函数. * @author InternetTeam3 * @version 1.0 */ ...

  6. Node.js折腾记一(改进):文件夹目录树获取

    前言 这是第一个版本: 用来干什么:想干嘛干嘛 为什么写:写来玩,学习node.js文件系统相关api:树结构这种东西还是挺不错的,会用会造才是真的会 用了什么: fs.readdir(dir), f ...

  7. Windows 通过CMD指令导出的文件夹/文件的目录树

    例如: 有文件夹如下图所示: 想要导出文件及文件夹的目录树,可以通过以下操作: 电脑左下角  开始--->输入cmd回车 比如我要导出 我的电脑 d盘 下的 test文件夹 cmd默认路径为C盘 ...

  8. pycharm设置显示返回工具箭头菜单和显示哪个文件左侧目录树显示到哪个文件

    1. 设置显示返回上次光标位置所在文件 2. 设置显示哪个文件,右侧目录树就显示那个文件所在的位置

  9. 如何生成文件夹目录树文件

    小记: cd>:目标文件夹 tree /f > list.txt 效果图: 转载于:https://juejin.im/post/5c7655925188255e266aba5a

最新文章

  1. 蚂蚁金服大佬自述:保持学习力,永远胜过不切实际的一夜暴富幻想!
  2. 一文精简介绍CNN基本结构
  3. android开发 获取父控件的高宽
  4. pyCharm 当中使用VirtualEnv
  5. 常见前端数据格式转换
  6. 【FZU - 2140 】Forever 0.5 (计算几何,构造)
  7. java调用linux设备,使用Java调用Linux系统命令
  8. centos 6.5下安装fpm打包工具
  9. 软件测试实用技术与常用模板:内容提要
  10. 使用Java实现简单串口通信
  11. PDF文件修改或做笔记后变得很大
  12. MATLAB在主成分分析中的应用
  13. Word的”交叉引用“和”插入题注“快捷键设置
  14. 上帝掷骰子吗?量子物理史话——读书笔记
  15. 关于下载《Java程序员,上班那点事儿》的电子版
  16. 批量无损压缩图片大小的工具Voralent Antelope
  17. eclipse配置https
  18. [bhpyg] QQ互联接口 ,第三方帐号登录
  19. 也看罗永浩的锤子手机
  20. ORACLE删除字段(setnbsp;unused…

热门文章

  1. 初识费用流 模板(spfa+slf优化) 餐巾计划问题
  2. FW 每秒百万级别的 HTTP 请求 sung: 重型的(heavy-duty)、分布式的、多协议测试工具...
  3. centos6.6安装python2.7
  4. hdu 1026 bfs+记录路径
  5. How do I cover the “no results” text in UISearchDisplayController's searchResultTableView?
  6. [恢]hdu 1259
  7. 熟悉的亲切-老外婆教做的豌豆蔬菜汤
  8. CentOS 7实战Kubernetes部署
  9. 背景建模之单高斯实现
  10. oracle之 变更OS时间对数据库的影响