Android: получить количество файлов в Zip? - PullRequest
8 голосов
/ 22 июля 2011

У меня есть вопрос, который кажется легким, но я не могу заставить его работать должным образом.

У меня в папке 'assets' есть zip-файл, который мне нужно распаковать, и у меня есть ProgessBar, в котором я хочу показать пользователю, как идет процесс.

У меня все работает, но я хочу установить максимальное значение ProgessBar равным количеству файлов в zip-файле.Количество файлов в этой папке иногда меняется, поэтому я хочу, чтобы ProgessBar был относительно количества файлов, содержащихся в zip.

Я использую ZipInputStream -API, но не похожеесть способ получить количество файлов в zip-файле.Единственное, о чем я могу думать, это сделать так:

   ZipInputStream zin = new ZipInputStream(getAssets().open(
                                "myFile.zip"));
   int numFiles = 0;
   int increment = 0;
   while (zin.getNextEntry() != null) {
     numFiles++;
    }

    ZipEntry ze = null;
    //Set the Max..value here..
    progessBar.setMax(numFiles);                
    while ((ze = zin.getNextEntry()) != null) {
       increment++;
       progessBar.setProgress(increment);
    }

Это работает, но наличие двух циклов while кажется немного избыточным, что в основном делает то же самое.

Я знаю, что тамэто ZipFile -API, который имеет size() -метод, но он требует пути к файлу, и, поскольку мой файл находится в папке 'assets', я почти уверен, что единственный способ прочитать из этого каталога - этопотоковое вещание.

Есть ли способ для меня это сделать?

Ответы [ 3 ]

8 голосов
/ 25 июля 2011

Спасибо за ответы.В итоге я использовал API: AssetFileDescriptor, чтобы получить размер файла zip и установив его в качестве значения ProgessBar.setMax().Затем, просматривая содержимое zip, я увеличиваю прогресс, используя размер файла каждой записи.Это работает, но меня беспокоит только то, что значение AssetFileDescriptor.getLength() и значения ZipEntry.getSize() возвращают значение long, поэтому я вынужден привести их к целому числу, прежде чем смогу установить максимальное значение и / или увеличить значениеProgessBar поэтому существует небольшая вероятность того, что я могу перегрузить целочисленное значение, вызывая исключение, но это маловероятно, поскольку я не ожидаю, что размеры моих файлов когда-либо станут больше, чем максимальная вместимость целого числа.

ZipInputStream zin = new ZipInputStream(getAssets().open(
                            "myFile.zip"));
ZipEntry ze = null;
AssetFileDescriptor mydisc = getAssets().openFd("myFile.zip");
//Size of the zip package
long size = mydisc.getLength();
long increment = 0;
dialog.setMax((int) size);
while ((ze = zin.getNextEntry()) != null) {
     increment += (int) ze.getSize();
     progessBar.setProgess((int)increment);
     //do more stuff..
}

Не лучшее решение, но оно работает.

Мне известен API ZipFile, но для него требуется передать строку, но я не уверен, каков путь к этому каталогу или какпонять?

4 голосов
/ 23 июля 2011

Используйте ZipFile API. Существует метод size, который возвращает число ZipEntries в ZipFile. Вы можете читать из папки активов.

пример:

int zipEntriesCount(String path) throws IOException {

     ZipFile zf= new ZipFile(path);
     return zf.size();
}
3 голосов
/ 23 июля 2011

Похоже, ваша основная проблема заключается в том, что вам нужно сделать progressBar.setMax() перед тем, как вы начнете читать файл, и вы устанавливаете макс в зависимости от количества файлов.

Задумывались ли вы о * 1004?* а затем отслеживает, сколько байтов вы написали при вызове progressBar.setProgress() вместо того, сколько файлов вы прочитали?Это должно решить вашу проблему и даст вам (imho) более точный индикатор выполнения.

...