java的ftp下載目錄

wmhx 12年前發布 | 5K 次閱讀 云計算 OpenOffice Mithril

長期在aix上看代碼,比較痛苦,想當下來回來看或者是備份呢,總是少這少那的,哎,這破系統東西真多,分布的到處都是,想自己搭個環境也總是缺少.h文件, 基于這幾年痛苦的代碼經歷,我就寫了這么個類來完成下載我們的代碼,不包括執行程序,壓縮包,或者是其他什么亂七八糟的東西,真的逼的, 湊活用吧, 后續在完善,
上代碼先:

public class FtpApp {

// 需要下載的文件后綴
private static String[] _ext = { ".cp", ".cpp", ".c", ".sh", ".h", ".xml", ".cfg", "makefile" };

// 不需要下載的目錄
private static String[] _not = { "/mgcrm/channel","/mgcrm/work","/mgcrm/run/cfg/commagent/etc","/mgcrm/run/backup", "/mgcrm/work/Python", "/mgcrm/run/cfile/tibss/iasm/src" };

// 本地存儲目錄
private static String local_path = "C:/";
// 遠程下載目錄
private static String path = "/mgcrm/work";

private static String username = "mgcrm";
private static String password = "mgcrm";
private static String HOST = "136.24.224.4";
private static int PORT = 21;

// 可以下載的文件列表<全路徑>
// static List<String> li_file = new ArrayList<String>();
// 可以下載的目錄<全路徑>
// static List<String> li_path = new ArrayList<String>();

private static FtpClient ftpClient = null;

/**
 * connectServer 連接ftp服務器
 * @throws java.io.IOException
 * @param path  文件夾,空代表根目錄
 * @param password  密碼
 * @param user  登陸用戶
 * @param server  服務器地址
 */
public void connectServer(String server, int port, String user, String password) throws IOException {
    // server:FTP服務器的IP地址;user:登錄FTP服務器的用戶名
    // password:登錄FTP服務器的用戶名的口令;path:FTP服務器上的路徑
    ftpClient = new FtpClient();
    ftpClient.openServer(server, port);
    ftpClient.login(user, password);
    // 用2進制上傳、下載
    ftpClient.binary();
}

/**
 * closeServer 斷開與ftp服務器的鏈接
 */
private void closeServer() {
    try {
        if (ftpClient != null) {
            ftpClient.closeServer();
        }
    } catch (IOException e) {
        e.printStackTrace();
    }
}

/**
 * 取得某個目錄下的所有文件列表
 * @throws IOException
 */
private List<String> getFileList(String path) {
    List<String> list = new ArrayList<String>();
    BufferedReader dis = null;
    try {
        TelnetInputStream nameList = ftpClient.nameList(path);
        if (nameList != null) {
            dis = new BufferedReader(new InputStreamReader(nameList));
            String filename = "";
            while ((filename = dis.readLine()) != null) {
                list.add(filename);
            }
        }
    } catch (IOException e) {
    } finally {
        if (dis != null) {
            try {
                dis.close();
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
    }
    return list;
}

/**
 * 將FTP的文件改名<未使用>
 */
private boolean rename(String srcFileName, String destFileName) {
    boolean flag = false;

    try {
        ftpClient.rename(srcFileName, destFileName);
        flag = true;
    } catch (Exception ex) {
        ex.printStackTrace();
        flag = false;
    }

    return flag;
}

/**
 * download 從ftp下載文件到本地
 * @throws java.lang.Exception
 * @return long
 * @param newfilename 本地生成的文件名
 * @param filename 服務器上的文件名
 */
private long download(String filename, String newfilename) throws Exception {
    long result = 0;
    TelnetInputStream is = null;
    FileOutputStream os = null;
    try {
        is = ftpClient.get(filename);

        java.io.File outfile = new java.io.File(newfilename);
        os = new FileOutputStream(outfile);
        byte[] bytes = new byte[1024];
        int c;
        while ((c = is.read(bytes)) != -1) {
            os.write(bytes, 0, c);
            result = result + c;
        }
        outfile = null;
    } catch (IOException e) {
        e.printStackTrace();
        result = 0;
    } finally {
        if (is != null) {
            is.close();
        }
        if (os != null) {
            os.close();
        }
    }
    return result;
}




/**
 * @param args
 */
public static void main(String[] args) {
    FtpApp dao = new FtpApp();
    try {
        dao.connectServer(HOST, PORT, username, password);

        dao.getList(path);
        // dao.downloads(li_file, local_path);
    } catch (IOException e) {
        e.printStackTrace();
    }finally{
        dao.closeServer();
    }
}

private void downloadsOne(String path) {
    String local_file = null;
    local_file = local_path + path;
    createPathifNotExists(local_file);
    try {
        if (localFileExists(local_file)) {
            return;
        }
        download(path, local_file);
        System.out.println(path + " is downloaded :" + local_file);
    } catch (Exception e) {
        e.printStackTrace();
    }
}

private boolean localFileExists(String local_file) {
    return new File(local_file).exists();
}

private void downloads(List<String> li_file2, String local_path) {
    String local_file = null;
    String remoute_file = null;
    for (int i = 0; i < li_file2.size(); i++) {
        remoute_file = li_file2.get(i);
        local_file = local_path + remoute_file;
        createPathifNotExists(local_file);
        try {
            download(remoute_file, local_file);
        } catch (Exception e) {
            e.printStackTrace();
        }
        System.out.println(remoute_file + ", is download: " + local_file);
    }

}

private void createPathifNotExists(String local_file) {
    local_file = local_file.replace("http://", "/");
    int c = local_file.lastIndexOf('/');
    String fs = local_file.substring(0, c);
    File f = new File(fs);
    if (!f.exists()) {
        f.mkdirs();
    }
    f = null;
}

private void getList(String path) {
    List<String> ls = new ArrayList<String>();
    String pwd = null;

    if (path == null || path.trim().equals("")) {
        return;
    }
    try {
        ftpClient.cd(path);
        System.out.println("cd " + path);
    } catch (IOException e) {
            if (isOkFile(path)) {
                // /
                downloadsOne(path);
                // li_file.add(path);
            }
        return;
    }
    try {
        pwd = ftpClient.pwd();
        ls = this.getFileList(pwd);
    } catch (IOException e) {
        e.printStackTrace();
    }
    if (ls == null || ls.size() < 1) {
        return;
    }
    if (notDownloadDir(pwd)) {
        return;
    }

    // li_path.add(path);
    if (ls != null) {
        for (int i = 0; i < ls.size(); i++) {
            getList(ls.get(i));
        }
    }
}

private boolean notDownloadDir(String pwd) {
    for (int i = 0; i < _not.length; i++) {
        if (pwd.startsWith(_not[i])) {
            return true;
        }
    }
    return false;
}

private static boolean isOkFile(String path) {
    for (int i = 0; i < _ext.length; i++) {
        if (path.endsWith(_ext[i])) {
            return true;
        }
    }
    return false;
}

}</pre>我試過了,將系統近600m的代碼下載下來, ( 真不知道這么會有這么多垃圾代碼 )
后續需要完善的:
1,寫成配置
2,多進程
3,日志記錄
4,文件重命名
5,本地壓縮
6,優化代碼 - 創建文件夾的那段著實寫的不好,其他還可以用正則什么的

長期寫c的,偶爾java了一把,自我鼓勵下:還不賴, 就當v1吧,看先.

將例子寫好,加入配置: http://download.csdn.net/detail/zpwmhx/4342943

 本文由用戶 wmhx 自行上傳分享,僅供網友學習交流。所有權歸原作者,若您的權利被侵害,請聯系管理員。
 轉載本站原創文章,請注明出處,并保留原始鏈接、圖片水印。
 本站是一個以用戶分享為主的開源技術平臺,歡迎各類分享!