帅气的毛毛侠

导航

使用ftpClient下载ftp上所有文件

需求:最新项目需要,写个小功能,需求就是实时下载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();
    }

 

posted on 2017-04-24 00:33  帅气的毛毛侠  阅读(6315)  评论(0编辑  收藏  举报