遍历FTP下的所有文件

package com.at21.scan.quartz;

import java.io.IOException;
import java.math.BigDecimal;
import java.util.Date;

import org.apache.commons.net.ftp.FTP;
import org.apache.commons.net.ftp.FTPClient;
import org.apache.commons.net.ftp.FTPFile;
import org.apache.commons.net.ftp.FTPReply;

public class ListFtp {

    private int recNum = 0;
    private boolean isPort=false;
    private int port=0;

    public static void main(String[] args) throws Exception {

        ListFtp listFtp = new ListFtp();
        //要扫描的ftp站点地址,用户名和密码,其中地址不用填前半部分信息。
        //如果ftp不需要用户名和密码就能直接进入其实是匿名登录方式。此时用户名是:anonymous,密码为空
        //如:listFtp.loginFtp("ftp.jmu.edu.cn", "anonymous", "");
        String url="ftp://admin:admin@172.24.3.152/ATCenter/FTPService/Data/NDI/wv";
        String[] urlArr=url.split("@");
        String[] usernameAndPassword=urlArr[0].substring(6).split(":");
        String hostAndPort=urlArr[1].split("/")[0];
        String[] hostAndPortArr=hostAndPort.split(":");
        if(hostAndPortArr.length>1){
            listFtp.isPort=true;
            listFtp.port=Integer.valueOf(hostAndPortArr[1]);
        }
//        FTPClient ftp = listFtp.loginFtp("172.24.3.152", "admin", "admin");
        FTPClient ftp = listFtp.loginFtp(hostAndPortArr[0], usernameAndPassword[0], usernameAndPassword[1]);
        listFtp.traverse("ftp://admin:admin@172.24.3.152/ATCenter/FTPService/Data/NDI/wv", ftp, "/ATCenter/FTPService/Data/NDI/wv/");
        System.out.println("总共有" + listFtp.recNum +"个文件。");
        System.out.println("---------------------------------");
//        listFtp.ftpClose(ftp);
    }

    //Ftp登陆,注意此处host不能带ftp://,直接传入站点后半部分就可以了
    public FTPClient loginFtp(String host, String user, String pass) {
        int reply;
        boolean loginFlag = false;
        FTPClient ftp = new FTPClient();
        ftp.setControlEncoding("UTF-8");
        try {
            if(isPort){
                ftp.connect(host, port);
            }else{
                ftp.connect(host);
            }
            System.out.println("Connected to " + host);
            System.out.print(ftp.getReplyString());
            reply = ftp.getReplyCode();
            ftp.setFileTransferMode(FTP.ASCII_FILE_TYPE);
            if (!FTPReply.isPositiveCompletion(reply)) {
                ftp.disconnect();
                System.err.println("FTP server refused connection.");
                System.exit(1);
            }
            loginFlag = ftp.login(user, pass);
        } catch (IOException e) {
            e.printStackTrace();
        }
        if (loginFlag) {
            System.out.println("login success");
            System.out.println("host" + host);
            return ftp;
        } else {
            System.out.println("login failed");
            return null;
        }
    }

    //与ftp断开连接
    public void ftpClose(FTPClient ftp) {
        try {
            ftp.logout();
        } catch (IOException e) {
            e.printStackTrace();
        }
        if (ftp.isConnected()) {
            try {
                ftp.disconnect();
            } catch (IOException ioe) {
                ioe.printStackTrace();
            }
        }
        System.out.println("与ftp断开连接!");
    }

    // 遍历并打印ftp站点资源信息
    public void traverse(String host, FTPClient client, String path) {
        String prefix = "";
        try {
            FTPFile[] files = client.listFiles(path);
//            FTPFile[] files = client.listFiles();
            for (int i = 0; i < files.length; i++) {
                // 如果是文件夹就递归方法继续遍历
                if (files[i].isDirectory()) {
                    /*
                     * 创建新目录时会自动创建两个文件名: . 和 .. 点指当前目录 点点指父目录
                     */
                    // 注意这里的判断,否则会出现死循环
                    if (!files[i].getName().equals(".")
                            && !files[i].getName().equals("..")) {
                        String tempDir = client.printWorkingDirectory() + "/"
                                + files[i].getName();
                        client.changeWorkingDirectory(tempDir);
                        // 是文件夹就递归调用
                        traverse(host, client, tempDir);
                        prefix += client.printWorkingDirectory();
                        client.changeToParentDirectory();
                    }
                    // 如果是文件就扫描信息
                } else {
                    String temp = client.printWorkingDirectory();
                    Date date = null;
                    // 根目录下的文件
                    if (temp.equals("/")) {
                        recNum++;
                        date = files[i].getTimestamp().getTime();
                        java.sql.Date date2 = new java.sql.Date(date.getTime());
                        System.out.println("文件名:" + files[i].getName());
                        System.out.println("文件路径:" + host + temp);
                        System.out.println("文件大小:" + format(files[i].getSize()));
                        System.out.println("最后修改日期:" + date2);
                        System.out.println("-----------------------------------");
                        // 不是根目录下的文件
                    } else {
                        recNum++;
                        // 得到文件的时间戳
                        date = files[i].getTimestamp().getTime();
                        // 转换成保存到数据库的时间格式
                        java.sql.Date date2 = new java.sql.Date(date.getTime());
                        // 如果扫描是文件就将信息保存到数据库
                        System.out.println("文件名:" + files[i].getName());
                        System.out.println("文件路径:" + host + temp + "/");
                        System.out.println("文件大小:" + format(files[i].getSize()));
                        System.out.println("最后修改日期:" + date2);
                        System.out.println("-----------------------------------");
                    }
                }
            }
        } catch (IOException e) {
            e.printStackTrace();
        }
    }

    // 转换文件大小的方法
    public String format(long size) {
        if (size < 1024) {
            return size + "B";
        } else if (size < 1048576) {
            double beforeNum = size / 1024;
            double temp = size % 1024;
            double afterNum = temp / 1024;
            // 取小数点后1位
            double num = new BigDecimal(beforeNum + afterNum).setScale(1,
                    BigDecimal.ROUND_HALF_UP).doubleValue();
            return num + "KB";
        } else if (size < 1073741824) {
            double beforeNum = size / 1048576;
            double temp = size % 1048576;
            double afterNum = temp / 1048576;
            double num = new BigDecimal(beforeNum + afterNum).setScale(2,
                    BigDecimal.ROUND_HALF_UP).doubleValue();
            return num + "MB";
        } else {
            double beforeNum = size / 1073741824;
            double temp = size % 1073741824;
            double afterNum = temp / 1073741824;
            double num = new BigDecimal(beforeNum + afterNum).setScale(2,
                    BigDecimal.ROUND_HALF_UP).doubleValue();
            return num + "GB";
        }
    }
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

夸父CV(kuafucv)

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值