关闭

用FtpClient实现的FTP全目录下载

标签: FtpClientFtp全目录下载
276人阅读 评论(0) 收藏 举报
分类:

FTP数据上传下载用到的开发包是commons-net-1.4.1.jar

现在本机上配置一个ftp服务器目录,配置完成后的参数信息:

	final static String HOST="172.20.16.76";    //本机ip地址
	final static int PORT=9500;                 //FTP端口号
	final static String USERNAME="lyc";         //FTP用户名
	final static String PASSWORD="123456";      //FTP登录密码
	final static String LOCAL_DIRECTORY="E:/delphi7Project/ftpDownload";  //下载到本地时目录

检索FTP全目录,然后递归循环下载文件

	
public static void doDownload(String path) throws IOException{
	//创建本地目录
	makeDirs(path);
	//切换工作目录
	ftpClient.changeWorkingDirectory(new String(path.getBytes(),"ISO-8859-1"));
	//获取目录下的文件列表
        String[] fileNames = ftpClient.listNames(); 
        //循环下载FTP目录下的文件
        for(String fname:fileNames){
        	if(isDirectory(path+"/"+fname)){
        		//递归调用
        		doDownload(path+"/"+fname);
        	}else{
        		//下载单个文件
        		downloadFile(path+"/"+fname);
        	}
        }
}

全文代码如下:

package com.test;

import org.apache.commons.net.ftp.FTPClient;

import java.io.File;
import java.io.FileInputStream;
import java.io.IOException;
import java.io.FileOutputStream;
import java.io.OutputStream;
import java.net.SocketException;

import javax.swing.JFileChooser; 
import javax.swing.SwingUtilities;
import javax.swing.UIManager;


public class FtpTest {
	static FTPClient ftpClient;
<pre name="code" class="java">	final static String HOST="172.20.16.76";
	final static int PORT=9500;
	final static String USERNAME="lyc";
	final static String PASSWORD="123456";
	final static String LOCAL_DIRECTORY="E:/delphi7Project/ftpDownload";
	
	public static void login() throws SocketException, IOException{
		ftpClient = new FTPClient();
		ftpClient.connect(HOST,PORT);
		ftpClient.login(USERNAME, PASSWORD);
		//设置编码
        ftpClient.setControlEncoding("GBK");
        ftpClient.setBufferSize(8096);
	}
	//判断给定的路径是文件还是文件夹
	public static boolean isDirectory(String path) throws IOException{
		//如果是文件,就会返回false
		//如果文件夹或文件名中含有中文,这里要转换一下,不然会返回false
		return ftpClient.changeWorkingDirectory(new String(path.getBytes(),"ISO-8859-1"));
	}
	
	//判断本地路径是否存在,不存在就创建路径
	public static void makeDirs(String path){
		File localFile = new File(LOCAL_DIRECTORY+path);
		if(!localFile.exists()){
			localFile.mkdirs();
		}
	}
	
	//下载单个文件
	public static void downloadFile(String dir) throws IOException{
        File file = new File(LOCAL_DIRECTORY + dir);      
        OutputStream os = new FileOutputStream(file);  
        ftpClient.setControlEncoding("GBK");
        ftpClient.setFileType(FTPClient.BINARY_FILE_TYPE);
        //如果文件名中含有中文,retrieveFile文件时会找不到FTP上的文件,导致保存在本地的是一个空文件,所以也要转换一下
        ftpClient.retrieveFile(new String(file.getName().getBytes(),"ISO-8859-1"), os);
        os.close();
	}
	
	//下载任务,递归调用,循环下载所有目录下的文件
	public static void doDownload(String path) throws IOException{
		//创建本地目录
		makeDirs(path);
		//切换工作目录
		ftpClient.changeWorkingDirectory(new String(path.getBytes(),"ISO-8859-1"));
		//获取目录下的文件列表
        String[] fileNames = ftpClient.listNames(); 
        //循环下载FTP目录下的文件
        for(String fname:fileNames){
        	if(isDirectory(path+"/"+fname)){
        		//递归调用
        		doDownload(path+"/"+fname);
        	}else{
        		//下载单个文件
        		downloadFile(path+"/"+fname);
        	}
        }
	}
	
	//实时同步ftp目录文件到本地
	public static class MyRun implements Runnable{
		@Override
		public void run() {
			while(true){
				try {
					Thread.sleep(10*1000);
					doDownload("/");
				} catch (InterruptedException e) {
					e.printStackTrace();
				} catch (IOException e) {
					e.printStackTrace();
				}
				
			}
		}
	}
    public static void main(String[] args) throws SocketException, IOException {
    	//连接FTP服务器
    	login();
    	//全目录下载
    	MyRun myRun = new MyRun();
    	new Thread(myRun).start();
    	//testUpload();
    } 

     // FTP上传文件    
    public static void testUpload() {
        FTPClient ftpClient = new FTPClient();
        FileInputStream fis = null;

        try {
            ftpClient.connect("172.20.16.76",9500);
            ftpClient.login("lyc", "123456");

            JFileChooser fd = new JFileChooser();  
            try {
                UIManager.setLookAndFeel("com.sun.java.swing.plaf.windows.WindowsLookAndFeel");
            } 
            catch (Exception e) {
                e.printStackTrace();
            }
            SwingUtilities.updateComponentTreeUI(fd);           
            fd.showOpenDialog(null);  
            File srcFile = fd.getSelectedFile();  
            //if(srcFile != null){}              
            
            fis = new FileInputStream(srcFile);
            //设置上传目录
            ftpClient.changeWorkingDirectory("/img");
            //ftpClient.setBufferSize(1024);
            ftpClient.setControlEncoding("GBK");
            //设置文件类型(二进制)
            ftpClient.setFileType(FTPClient.BINARY_FILE_TYPE);
            ftpClient.storeFile(srcFile.getName(), fis);
        } catch (IOException e) {
            e.printStackTrace();
            throw new RuntimeException("FTP客户端出错!", e);
        } finally {
            try {
                ftpClient.disconnect();
            } catch (IOException e) {
                e.printStackTrace();
                throw new RuntimeException("关闭FTP连接发生异常!", e);
            }
        }
    }

} 




0
0

猜你在找
【直播】机器学习&数据挖掘7周实训--韦玮
【套餐】系统集成项目管理工程师顺利通关--徐朋
【直播】3小时掌握Docker最佳实战-徐西宁
【套餐】机器学习系列套餐(算法+实战)--唐宇迪
【直播】计算机视觉原理及实战--屈教授
【套餐】微信订阅号+服务号Java版 v2.0--翟东平
【直播】机器学习之矩阵--黄博士
【套餐】微信订阅号+服务号Java版 v2.0--翟东平
【直播】机器学习之凸优化--马博士
【套餐】Javascript 设计模式实战--曾亮
查看评论
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
    个人资料
    • 访问:7707次
    • 积分:190
    • 等级:
    • 排名:千里之外
    • 原创:10篇
    • 转载:5篇
    • 译文:0篇
    • 评论:0条
    文章分类