Android: ¿Obtener el número de archivos dentro de Zip?
Tengo una pregunta que parece fácil, pero no puedo conseguir que funcione correctamente.
Tengo un archivo zip dentro de mi carpeta 'assets' que necesito descomprimir y tengo un ProgessBar
en el que quiero mostrar al usuario cómo va el progreso.
- Descomprimir archivo en activos de Android
- Creación de un archivo zip con algunos archivos en SDCard
- Si no comprimo un archivo de texto sin formato en Android, ¿se comprimirá en el APK de todos modos?
- Adición de Parse-1.8.0 a Android Studio 1.0.1 (O cualquier archivo .zip)
- Descomprimir archivo zip da "java.util.zip.ZipException: No se puede leer la versión" o "java.util.ZipException No se puede leer la versión de encabezado local 45"
Tengo todo el funcionamiento pero quiero fijar el valor máximo de ProgessBar
para ser el número de archivos dentro del archivo de cierre ProgessBar
. El número de archivos dentro de esta carpeta a veces cambia así que quiero que el ProgessBar
sea relativo a cuántos archivos están contenidos en el zip.
Estoy utilizando el ZipInputStream
-API, pero no parece que hay una manera de obtener el número de archivos dentro del archivo zip. La única forma en que puedo pensar es haciendo esto:
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); }
Esto funciona pero tener dos bucles while parece un poco redundante que básicamente están haciendo lo mismo.
Sé que hay un ZipFile
-API que tiene un size()
-método, pero requiere una ruta de acceso al archivo y ya que mi archivo se encuentra dentro de la carpeta de 'activos' Estoy seguro de que la única manera de leer de este directorio Es por streaming.
¿Hay alguna forma de lograr esto?
- ¿Cómo comprimir archivos zip con contraseña (AES) para iOS y Android?
- Cómo descomprimir archivos zip grandes y escribir en SDCARD en menos tiempo
- Compresión de datos en Android (aparte de java.util.zip?)
- La carga de archivos zip por FTP está dañada a veces
- No se puede cargar el archivo TTF directamente desde un ZIP usando libzip y FreeType
- Zip / comprimir una carpeta llena de archivos en android
- Android: descomprimir archivos zip codificados con contraseña
- Archivo zip con memoria en Java
Gracias por las respuestas. Lo que acabé haciendo utilizando la: AssetFileDescriptor
API para obtener el tamaño del archivo zip y la configuración que como el valor ProgessBar.setMax()
. A continuación, como bucle a través de los contenidos zip, incrementar el progreso mediante el uso de cada tamaño de archivo de entradas. Esto funciona, pero la única preocupación que tengo es que el valor AssetFileDescriptor.getLength()
, así como los valores ZipEntry.getSize()
devuelven un valor long
, así que estoy obligado a ZipEntry.getSize()
a un entero antes de que pueda establecer el valor máximo y / o Incrementar el ProgessBar
por lo que hay una posibilidad leve que podría sobrecargar un valor entero causando una excepción, pero esto no es probable porque no anticipo mis tamaños de archivo cada vez más grande que la capacidad máxima de retención de un entero.
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.. }
No es la mejor solución, pero funciona.
Estoy enterado de la API de ZipFile
pero requiere una secuencia de ser pasado adentro pero no estoy seguro cuál es la trayectoria a ese directorio o cómo conseguirlo?
Use ZipFile
API, Hay un método size
que devuelve el número de ZipEntries
en ZipFile
. Puede leer desde la carpeta de activos.
ejemplo:
int zipEntriesCount(String path) throws IOException { ZipFile zf= new ZipFile(path); return zf.size(); }
Su problema básico parece ser que usted tiene que hacer progressBar.setMax()
antes de que comience a leer el archivo, y usted está fijando el máximo basado en el número de archivos.
¿Has pensado en hacer progressBar.setMax(zin.getSize())
y luego hacer un seguimiento de cuántos bytes has escrito cuando llamas a progressBar.setProgress()
, en lugar de cuántos archivos has leído? Esto debería resolver su problema y le dará (imho) una barra de progreso más precisa.