Получение FileSize до InputStream - PullRequest
2 голосов
/ 12 августа 2010

Я хочу создать прогрессбар для загрузки по FTP.На сервере, с которого я загружаю файл, скрыты все его каталоги и файлы.Я хочу отобразить ход загрузки.Есть ли способ получить размер файла?Вот мой текущий код:

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

Ответы [ 2 ]

1 голос
/ 12 августа 2010

Нет способа сделать это надежно во всех службах FTP.

Протокол FTP не обеспечивает способ получения размеров файлов, поэтому вам нужно будет обратиться к списку каталогов и отменить выбор (специфичный для сервера) текста, который вы получите.Более того, нет никакой гарантии, что список каталогов будет включен, или что у вас будет разрешение на создание списка каталогов.

Сказав это, некоторые библиотеки FTP могут быть настроены для получения размера файла.Например, с библиотекой Apache FTPClient вы можете (попытаться) использовать метод listFiles(String) и посмотреть получившийся объект FTPFile.

EDIT

@ Кевин Брок упоминает команду FTP SIZE как возможную.

  • Эта команда была впервые определена в RFC 3659 в 2007 году. Многие развернутые FTP-серверпрограммное обеспечение намного старше этого.
  • SIZE - необязательная команда;т. е. даже серверы, соответствующие RFC 3659, не обязаны его поддерживать.
  • Даже если SIZE поддерживается сервером, текущие API-интерфейсы Apache FTPClient не включают в себя метод получения размера файла (кроме как через *).1024 *).Конечно, это может измениться в будущем.
  • Класс ftp4j FTPClient, очевидно, реализует SIZE и делает его доступным с помощью метода fileSize(...).
0 голосов
/ 16 мая 2013

Я не нашел простой команды для этого. Мое решение состояло в том, чтобы вызвать команду пропуска, которая должна возвращать количество пропущенных байтов. Суммируйте это до тех пор, пока skip не вернет 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);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...