生成ftp文件的目录树
依赖
<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 + "拒绝连接");
        }
        //登陆ftp
        boolean 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);
    }
}
生成ftp文件的目录树的更多相关文章
- python生成指定文件夹目录树
		# -*- coding: utf-8 -*- import sys from pathlib import Path class DirectionTree(object): "" ... 
- C#实现生成Markdown文档目录树
		前言 之前我写了一篇关于C#处理Markdown文档的文章:C#解析Markdown文档,实现替换图片链接操作 算是第一次尝试使用C#处理Markdown文档,然后最近又把博客网站的前台改了一下,目前 ... 
- 使用tree命令导出文件夹/文件的目录树
		前提:己安装扩展: 介绍: TREE [drive:][path] [/F] [/A] /F 显示每个文件夹中文件的名称.(带扩展名) /A 使用 ASCII 字符,而不使用扩展字符. t ... 
- paip.tree 生成目录树到txt后的折叠查看
		paip.tree 生成目录树到txt后的折叠查看 作者Attilax , EMAIL:1466519819@qq.com 来源:attilax的专栏 地址:http://blog.csdn.ne ... 
- c# 表达式目录树拷贝对象(根据对象类型动态生成表达式目录树)
		表达式目录树,在C#中用Expression标识,这里就不介绍表达式目录树是什么了,有兴趣可以自行百度搜索,网上资料还是很多的. 这里主要分享的是如何动态构建表达式目录树. 构建表达式目录树的代码挺简 ... 
- Python中的文件和目录操作实现
		Python中的文件和目录操作实现 对于文件和目录的处理,虽然可以通过操作系统命令来完成,但是Python语言为了便于开发人员以编程的方式处理相关工作,提供了许多处理文件和目录的内置函数.重要的是,这 ... 
- PHP生成压缩文件开发实例
		大概需求: 每一个订单都有多个文件附件,在下载的时候希望对当前订单的文件自动打包成一个压缩包下载 细节需求:当前订单号_年月日+时间.zip 例如: 1.生成压缩文件,压缩文件名格式: 2.压缩文件 ... 
- Python之文件与目录
		file 通常建议使用open()打开文件,file用于类型判断 如果要把数据写到磁盘上,除调用flush()外,还得用sync(),以确保数据从系统缓冲区同步到磁盘.close()总是会调用这两个方 ... 
- WINDOWS 的 MKLINK : 硬链接,符号链接 : 文件符号链接, 目录符号链接 : 目录联接
		玩转WIN7的MKLINK 引言: 换了新电脑,终于再次使用上啦WIN7 ,经过一个周每天重装N次系统,... ... ... ... 在xp系统下,junction命令要用微软开发的小程序 junc ... 
随机推荐
- currency
			currency 美 ['kʌrənsi] 英 ['kʌrənsi] n.货币:通货:通用:流行 网络流通:货币型:币种 
- pt-table-checksum报错Skipping chunk【转】
			用pt-table-checksum校验数据时有以下报错,是因为current chunk size大于默认chunk size limit=2.0 24636 rows -02T20:: Skipp ... 
- win7 激活码 秘钥
			019.06最新windows7旗舰版系统激活码: 目前市面上的win7旗舰版激活码大部分都已经过期或失效了,下面来分享一些最新的. win7旗舰版激活密钥: BG2KW-D62DF-P4HY6-6J ... 
- 空指针异常 自动拆箱 防止 NPE,是程序员的基本修养 本手册明确防止 NPE 是调用者的责任。
			空指针异常 空指针异常是指java中的异常类. 中文名 空指针异常 外文名 NullPointerException 当应用程序试图在需要对象的地方使用 null 时,抛出该异常.这种情况包括: ... 
- 004 springboot文件上传
			关于文件上传,在spring cloud会再经过配置文件的处理,在spring boot则不需要,在这里写一个文件上传的接口. 单文件上传,如果以后写多文件上传再进行补充. 1.文件目录 2.控制器程 ... 
- 廖雪峰Git教程2
			转自:https://www.liaoxuefeng.com/wiki/896043488029600 [远程仓库] 到目前为止,我们已经掌握了如何在Git仓库里对一个文件进行时光穿梭,你再也不用担心 ... 
- Typescript 介绍和安装编译
			一. Typescript 介绍 1. TypeScript 是由微软开发的一款开源的编程语言. 2. TypeScript 是 Javascript 的超级,遵循最新的 ES6.Es5 规范.Typ ... 
- WPF  ContextMenu DataTemplate MenuItem  Visibility  问题
			问题: ContextMenu 的 DataTemplate 中 MenuItem 设置 Visibility 不起作用 需要添加一下样式才可以: <ContextMenu.ItemContai ... 
- netty WEBSOKET 客户端 JAVA
			https://blog.csdn.net/mafei6827/article/details/80657405 https://blog.csdn.net/u010939285/article/de ... 
- POJ Corn Fields 状态压缩DP基础题
			题目链接:http://poj.org/problem?id=3254 题目大意(名称什么的可能不一样,不过表达的意思还是一样的): 种玉米 王小二从小学一年级到现在每次考试都是班级倒数第一名,他的爸 ... 
