生成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);
    }

}

原文地址:https://www.cnblogs.com/qiaozhuangshi/p/11216455.html

时间: 2024-10-07 19:34:13

生成ftp文件的目录树的相关文章

生成目录树

文件目录树: tree D:\JabinDOC\工作文档 > tree.txt /f #使用cmd窗口执行 文件夹目录树: tree D:\JabinDOC\工作文档 > tree.txt #没有/f 原文地址:https://www.cnblogs.com/maoriaty/p/8423236.html

Python中的文件和目录操作实现代码

对于文件和目录的处理,虽然可以通过操作系统命令来完成,但是Python语言为了便于开发人员以编程的方式处理相关工作,提供了许多处理文件和目录的内置函数.重要的是,这些函数无论是在Unix.Windows还是Macintosh平台上,它们的使用方式是完全一致的. 本文将详细解释这些函数的使用方法.首先,我们介绍Python语言中类似于Windows系统的dir命令的列出文件功能,然后描述如何测试一个文件名对应的是一个标准文件.目录还是链接,以及提取文件大小和日期的方法.之后,我们还将介绍如何删除文

Python文件和目录操作实例代码

对于文件和目录的处理,虽然可以通过操作系统命令来完成,但是Python语言为了便于开发人员以编程的方式处理相关工作,提供了许多处理文件和目录的内置函数.重要的是,这些函数无论是在Unix.Windows还是Macintosh平台上,它们的使用方式是完全一致的. 本文将详细解释这些函数的使用方法.首先,介绍Python语言中类似于Windows系统的dir命令的列出文件功能,然后描述如何测试一个文件名对应的是一个标准文件.目录还是链接,以及提取文件大小和日期的方法.之后,还将介绍如何删除文件和目录

PHP生成压缩文件开发实例

大概需求: 每一个订单都有多个文件附件,在下载的时候希望对当前订单的文件自动打包成一个压缩包下载 细节需求:当前订单号_年月日+时间.zip  例如: 1.生成压缩文件,压缩文件名格式: 2.压缩文件存放在根目录 /upload/zipfile/年月/自定义的压缩文件名.zip 3.点击下载压缩包,系统开始对压缩文件打包,打包完成后自动开始下载 4.为了防止暴露压缩包文件路径,需要对下载的压缩包文件名改名 具体操作模式请见下面的代码: 文件路径: 压缩包文件存放路径:/upload/zipfil

CodeSmith 二、多模板按目录树批量自动生成代码

通过调用指定目录下的所有模板,逐一按照数据表生成独立的代码文件.支持多模板调用.支持所有数据表生成或批量指定多个生成.支持自动的文件目录结构.支持代码文件格式化命名等. 背景:最近一个新项目一高兴选了Mysql 8,结果出了好几个麻烦. Toad for mysql 连不上了,习惯的动软代码生成器也连不上了.  还是挺喜欢动软的傻瓜式操作的,现在没办法了试试CodeSmith,折腾了半天终于算是出坑了, 做个笔记免得下次再跳. 一.需求分析 大概的需求: 1.批量选择表:先选择数据库,然后选择这

高效系列:bat生成文件夹目录 & 折腾exe及icon配合

有时候我们需要新生成一套文件夹目录,就比如项目管理目录 大概的清单如下: ├─01.项目管理 │  ├─01.立项文档 │  ├─02.策划文档 │  ├─03.管理监控 │  ├─04.配置管理 │  ├─05.质量保证 │  ├─06.验收文档 │  ├─07.项目报告 │  ├─08.评审报告 │  ├─09.变更管理 │  ├─10.结项文档 │  ├─11.会议记录 │  └─12.其它文档 ├─02.需求文档 │  ├─01.用户需求说明书 │  └─02.需求规格说明书 ├─03.

python【使用简单的os.walk生成目录树】

思路比较简单,使用os.walk 生成目录信息,然后再进行字符串操作,所以没有其他比较复杂的逻辑,但是生成的效果也比较简单,自己看看到是可以哈. 代码如下 # -*- coding: utf-8 -*- ''' Created on July 22, 2017 @author: hehe1234567 ''' import os def simple_dir_tree(ddir): for dirpath,dirnames,filenames in os.walk(ddir.strip(os.s

C#实现FTP文件的上传、下载功能、新建目录以及文件的删除

本来这篇博文应该在上周就完成的,可无奈,最近工作比较忙,没有时间写,所以推迟到了今天.可悲的是,今天也没有太多的时间,所以决定给大家贴出源码,不做详细的分析说明,如果有不懂的,可以给我留言,我们共同讨论. using System; using System.Collections.Generic; using System.IO; using System.Linq; using System.Net; using System.Security.Cryptography; using Sys

vs切换当前编辑文件时自动定位目录树

在编辑区,切换当前编辑文件时(单击.cpp或.h文件选项卡),"解决方案资源管理器"目录树会自动定位当前编辑的文件,并以灰色标识,当一个解决方案中的工程数目数目很多,每个工程下面又包含很多文件夹结构时,这个功能就能相当方便的自动定位出,当前编辑的文件在哪个工程中. 设置方法: [解决方案] 工具->选项- > 项目解决方案中,在解决方案资源管理器中跟踪活动项