【问题标题】:Android: How can I get the file size of a FTP file via FTPClient?Android:如何通过 FTPClient 获取 FTP 文件的文件大小?
【发布时间】:2012-11-05 01:46:15
【问题描述】:

如何读取存储在我的 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;
}

【问题讨论】:

    标签: android ftp download filesize


    【解决方案1】:

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

    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;
    }
    

    【讨论】:

      【解决方案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;
            }
         }         
      }         
      

      【讨论】:

        【解决方案3】:

        如果服务器不允许客户端列出文件。你可以试试size 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]);
          };
        

        【讨论】:

        • 可以使用getReplyString获取单个字符串,不需要使用getReplyString。另外不要忘记在拆分之前使用trim(),因为回复字符串的末尾可能包含\n。虽然这段代码确实返回了文件大小,但发生了一些奇怪的事情——至少在我的代码中:发送SIZE(并处理回复)后发送另一个命令总是返回回复“500 命令不理解”。 - 我用RETRCWD 对其进行了测试,但总是得到相同的结果。
        • 感谢 cmets。因为 FTP cmd 应该是隔离的。因此 CWD 和 RETR 不应受到 SIZE cmd 的影响。您可以尝试不使用 SIZE 的 CWD 和 RETR 吗?让我们看看是否得到了相同的结果。
        • 感谢您的回复。 CWDRETR 各自工作正常,这是 SIZE 命令似乎以某种方式搞砸了。您是否遇到同样的问题?
        • 这确实似乎是库的问题:我目前正在重写我的“登录”和“下载文件”代码以使用 Java 的基本 Socket 而不是库(因为那里还有其他问题),所以基本上我是“手动”做所有事情,然后发送SIZE,然后RETR 与我的新代码完美配合。然后我又运行了FTPClient 版本的代码,因为我注意到我也忘记了在那里切换到二进制模式,但是如果使用SIZE,它仍然返回500 错误消息。
        猜你喜欢
        • 2018-01-18
        • 2013-04-24
        • 1970-01-01
        • 1970-01-01
        • 2011-09-26
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多