1

我正在尝试将 FTP 路径中的所有文件下载到我的本地系统。但下载的文件为 0 KB。会有什么问题。请帮助我找到错误。(文件类型为 *.zip、*.pdf、*.xml)

提前致谢。

package ConnectFTP;

import java.io.FileOutputStream;
import java.io.IOException;
import java.util.Calendar;
import java.util.logging.Level;
import java.util.logging.Logger;

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 FTPDownloader {

FTPClient ftp = null;

public FTPDownloader(String host, String user, String pwd) throws Exception {
    ftp = new FTPClient();
    int reply;
    ftp.connect(host);
    reply = ftp.getReplyCode();
    if (!FTPReply.isPositiveCompletion(reply)) {
        ftp.disconnect();
        throw new Exception("Exception in connecting to FTP Server");
    }
    ftp.login(user, pwd);
    ftp.setFileType(FTP.BINARY_FILE_TYPE);
    ftp.enterLocalPassiveMode();
}

public void downloadFile(String remoteFilePath, String localFilePath) {
    try (FileOutputStream fos = new FileOutputStream(localFilePath)) {
        this.ftp.retrieveFile(remoteFilePath, fos);
    } catch (IOException ioe) {
        ioe.printStackTrace();
    }
}
public void disconnect() {
    if (this.ftp.isConnected()) {
        try {
            this.ftp.logout();
            this.ftp.disconnect();
        } catch (IOException ioe) {

        }
    }
}

public static void main(String[] args) {
    try {
        FTPDownloader ftpDownloader =
                new FTPDownloader("192.168.3.1", "Adminuser", "password");
        ftpDownloader.listFolders();
        System.out.println("File downloaded successfully");
        ftpDownloader.disconnect();
    } catch (Exception e) {
        e.printStackTrace();
    }
}

public void listFolders() {
    try {
        String ftpBasePath = "dev";
        FTPFile[] fileList = ftp.listDirectories("/" + ftpBasePath);
        for (FTPFile file : fileList) {
            listFiles(file.getName());
        }
    } catch (IOException ex) {
        Logger.getLogger(FTPDownloader.class.getName()).log(Level.SEVERE, null, ex);
    }
}

public void listFiles(String path) {
    try {
        FTPFile[] fileList = ftp.listFiles(path);
        for (FTPFile file : fileList) {
            String currentFileName = file.getName();
            String localPath = "E:\\FTPFiles\\"+currentFileName;
            try (FileOutputStream fos = new FileOutputStream(localPath)) {
                this.ftp.retrieveFile(currentFileName, fos);
            } catch (IOException ioe) {
                ioe.printStackTrace();
            }
        }
    } catch (IOException ioe) {
        Logger.getLogger(FTPDownloader.class.getName()).log(Level.SEVERE, null, ioe);
    }
}
}
4

1 回答 1

0

这是我的问题的解决方案。我修改了我的代码,做了一些小的改动。给定的代码将获取给定 ftp 路径中的所有文件,并将其存储在具有文件夹结构的本地目录中。

输出结构将如下例所示:

E:\FtpFiles\2013\November\11222013\*.*

*.* 是以 FTP 中的文件夹结构存储的文件

操作系统:Windows 2008 服务器(64 位)

但是,这将适用于所有 Windows FTP 服务器并将文件移动到本地系统或给定路径。

谢谢。

package ConnectFTP;

import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.File;
import java.io.FileOutputStream;
import java.io.FileReader;
import java.io.FileWriter;
import java.io.OutputStream;
import java.text.SimpleDateFormat;
import java.util.Date;
import org.apache.commons.net.ftp.FTPClient;
import org.apache.commons.net.ftp.FTPFile;
import org.apache.commons.net.ftp.FTPReply;


class UFTP {

public static void main(String[] args) {

    UFTP unftp = new UFTP();
    unftp.Unfile();
}

private void Unfile() {
    try {
        //Current Date, Month, Year Starts
        Date mmddyyyy = new Date();
        String today = new SimpleDateFormat("MMddyyyy").format(mmddyyyy);
        String cyear = today.substring(4, 8);
        String month[] = {"January", "February", "March", "April", "May", "June", "July", "August",
            "September", "October", "November", "December"};
        String cmonthS = today.substring(0, 2);
        int cmonthI = Integer.parseInt(cmonthS);
        cmonthS = month[cmonthI - 1];
        System.out.println("Month : " + cmonthS);
        System.out.println("Year  : " + cyear);
        //Current Date, Month, Year Ends

        FTPClient ftp = new FTPClient();
        ftp.connect("192.168.3.5");
        if (!ftp.login("dev", "password")) {
            ftp.logout();
        }
        int reply = ftp.getReplyCode();
        if (!FTPReply.isPositiveCompletion(reply)) {
            ftp.disconnect();
        }
        ftp.enterLocalPassiveMode();
        String ftpBasePath = "devpath";  //ftp Base Directory
        String localPath = "e:\\FtpFiles\\";

        //create DIR Tree
        //Create Year Dir
        File newDir = new File(localPath + cyear);
        if (!newDir.exists()) {
            System.out.println("creating directory: " + today);
            boolean result = newDir.mkdir();
            if (result) {
                System.out.println("Year DIR Created");
            }
        }
        localPath = localPath + cyear + "\\";

        //Create Month Dir
        newDir = new File(localPath + cmonthS);
        if (!newDir.exists()) {
            System.out.println("creating directory: " + today);
            boolean result = newDir.mkdir();
            if (result) {
                System.out.println("Month DIR created");
            }
        }
        localPath = localPath + cmonthS + "\\";

        //Create Date Dir  
        newDir = new File(localPath + today);
        if (!newDir.exists()) {
            System.out.println("creating directory: " + today);
            boolean result = newDir.mkdir();
            if (result) {
                System.out.println("Today DIR created");
            }
        }

        //creates today's dir
        //destinationBasePath = "e:\\FtpFiles\\" + today + "\\";
        localPath = localPath + today + "\\";
        FTPFile[] fileList = ftp.listDirectories("/" + ftpBasePath);
        for (FTPFile directory : fileList) {
            System.out.println(directory.getName());
            String currentDir = directory.getName();
            FTPFile[] ftpFiles = ftp.listFiles("/" + ftpBasePath + "/" + currentDir + "/");
            if (ftpFiles != null && ftpFiles.length > 0) {
                for (FTPFile file : ftpFiles) {
                    if (!file.isFile()) {
                        continue;
                    }
                    System.out.println("File is " + file.getName());
                    OutputStream output;

                    //Create Dir Starts
                    newDir = new File(localPath + currentDir);
                    // if the directory does not exist, create it
                    if (!newDir.exists()) {
                        System.out.println("creating directory: " + currentDir);
                        boolean result = newDir.mkdir();
                        if (result) {
                            System.out.println("DIR created");
                        }
                    }
                    //Create Dir Ends

                    output = new FileOutputStream(localPath + currentDir + "\\" + file.getName());
                    ftp.retrieveFile("/" + ftpBasePath + "/" + currentDir + "/" + file.getName(), output);
                    output.flush();
                    output.close();
                }
            }
        }
        ftp.logout();
        ftp.disconnect();

    } catch (Exception ex) {
        ex.printStackTrace();
    }
}
}
于 2013-11-22T10:22:19.390 回答