Android:如何通过FTPClient获取FTP文件的文件大小?

时间:2012-11-16 10:32:32

标签: android ftp download filesize

如何读取存储在ftp服务器上的文件的文件大小? 我不喜欢实施另一个图书馆。

我正在使用commons-io-2.4和commons-net-3.1

来自talhakosen的答案和代码(谢谢!)

private long getFileSize(FTPClient ftp, String filePath) throws Exception {
    long fileSize = 0;
    FTPFile[] files = ftp.listFiles(filePath);
    if (files.length == 1 && files[0].isFile()) {
        fileSize = files[0].getSize();
    }
    Log.i(TAG, "File size = " + fileSize);
    return fileSize;
}

3 个答案:

答案 0 :(得分:6)

您好,您可以使用以下代码,

private void ftpDownload() {
    FTPClient ftp = null;
    try {
        ftp = new FTPClient();
        ftp.connect(mServer);

        try {
            int reply = ftp.getReplyCode();
            if (!FTPReply.isPositiveCompletion(reply)) {
                throw new Exception("Connect failed: " + ftp.getReplyString());
            }
            if (!ftp.login(mUser, mPassword)) {
                throw new Exception("Login failed: " + ftp.getReplyString());
            }
            try {
                ftp.enterLocalPassiveMode();
                if (!ftp.setFileType(FTP.BINARY_FILE_TYPE)) {
                    Log.e(TAG, "Setting binary file type failed.");
                }
                transferFile(ftp);
            } catch(Exception e) {
                handleThrowable(e);
            } finally {
                if (!ftp.logout()) {
                    Log.e(TAG, "Logout failed.");
                }
            }
        } catch(Exception e) {
            handleThrowable(e);
        } finally {
            ftp.disconnect();
        }
    } catch(Exception e) {
        handleThrowable(e);
    }
}

private void transferFile(FTPClient ftp) throws Exception {
    long fileSize = getFileSize(ftp, mFilePath);
    InputStream is = retrieveFileStream(ftp, mFilePath);
    downloadFile(is, buffer, fileSize);
    is.close();

    if (!ftp.completePendingCommand()) {
        throw new Exception("Pending command failed: " + ftp.getReplyString());
    }
}

private InputStream retrieveFileStream(FTPClient ftp, String filePath)
throws Exception {
    InputStream is = ftp.retrieveFileStream(filePath);
    int reply = ftp.getReplyCode();
    if (is == null
            || (!FTPReply.isPositivePreliminary(reply)
                    && !FTPReply.isPositiveCompletion(reply))) {
        throw new Exception(ftp.getReplyString());
    }
    return is;
}

private byte[] downloadFile(InputStream is, long fileSize)
throws Exception {
    byte[] buffer = new byte[fileSize];
    if (is.read(buffer, 0, buffer.length)) == -1) {
        return null;
    }
    return buffer; // <-- Here is your file's contents !!!
}

private long getFileSize(FTPClient ftp, String filePath) throws Exception {
    long fileSize = 0;
    FTPFile[] files = ftp.listFiles(filePath);
    if (files.length == 1 && files[0].isFile()) {
        fileSize = files[0].getSize();
    }
    Log.i(TAG, "File size = " + fileSize);
    return fileSize;
}

答案 1 :(得分:0)

如果服务器不允许客户端列出文件。您可以尝试cmd大小。 请参阅Extensions to FTP RFC3659了解FTP cmd语法的大小。 您还可以使用以下功能示例。

private long getRemoteSize(FTPClient client, String remoteFilePath) throws Exception {
    client.sendCommand("SIZE", remoteFilePath);
    String[] reply = client.getReplyStrings();
    String[] response = reply[0].split(" ");
    if(client.getReplyCode() != 213){
      throw new Exception(String.format("ftp client size cmd response %d",client.getReplyCode()));
    }
    return Long.parseLong(response[1]);
  };

答案 2 :(得分:-2)

private long getFileSize(FTPClient ftpClient, String fileName) throws Exception 
{
   long fileSize = 0;
   String fileName; 
   //down file name 
   FTPFile[] files = ftpClient.listFiles(); //ftp list
   for ( i = 0; i < files.length; i++)
   { //ftp connect forder in files              
      if (fileName == files[i].getName())
      { 
        fileSize = files[i].getSize();
        return fileSize;
      }
   }         
}