我想为FTP下载创建一个progressBar。我下载文件的服务器隐藏了它的所有目录和文件。我想要显示下载的进度。有没有办法让我知道文件的大小?下面是我当前的代码:
FTPclient = new FTPClient();
FTPclient.setListHiddenFiles(true);
FTPclient.connect(hostPart);
FTPclient.login(userName, passWord);
FTPclient.setFileType(FTP.BINARY_FILE_TYPE);
InputStream instream = FTPclient.retrieveFileStream(pathExcludingHostIncludingFirstSlash);
int l;
byte[] tmp = new byte[2048];
int updateCounter = 0;
int bytesDownloaded = 0;
while ((l = instream.read(tmp)) != -1) {
fos.write(tmp, 0, l);
bytesDownloaded+=2048;
updateCounter++;
if(updateCounter==3){
kilobytesDownloaded=(bytesDownloaded / 1024);
publishProgress((String[])null);
updateCounter=0;
}发布于 2010-08-12 09:32:15
没有办法在所有FTP服务中可靠地做到这一点。
FTP协议不提供获取文件大小的方法,因此您需要请求一个目录列表并取消选择您返回的(特定于服务器的)文本。此外,不能保证将启用目录列表,也不保证您将拥有列出该目录的权限。
话虽如此,一些FTP库可以配置为尝试获取文件大小。例如,使用Apache库,您可以(尝试)使用listFiles(String)方法并查看生成的FTPFile对象。
编辑
@Kevin Brock提到FTP SIZE命令是一种可能性。
RFC3659于2007年首次定义了
listFiles)。当然,这在将来可能会改变。FTPClient类显然实现了SIZE,并通过其fileSize(...)方法使其可用。发布于 2013-05-17 00:04:36
我也没有找到一个简单的命令来做这件事。我的解决方案是调用跳过命令,该命令应返回跳过的字节数。对其求和,直到跳过返回0。由于文件结束以外的其他原因,skip可能会返回0,但在字段中它似乎工作得很好。
下面是一些示例代码:
InputStream checkStream = m_ftpClient.retrieveFileStream(name);
long fileLength = 0;
long transferredLength = 0;
do
{
transferredLength = checkStream.skip(MAX_BYTES);
fileLength += transferredLength;
}while(transferredLength > 0);https://stackoverflow.com/questions/3463934
复制相似问题