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.

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?

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.

  • ¿Cómo puedo mantener la estructura de las carpetas cuando comprime en Java?
  • Directorio de verificación de archivos zip de Java
  • Android Descargar Zip a la tarjeta SD?
  • No se puede extraer el archivo del archivo ZIP creado en Android (específico de dispositivo / OS)
  • Cómo leer un archivo directamente desde un archivo .zip sin extraerlo en android
  • Cómo crear un ZIP InputStream en Android sin crear primero un archivo ZIP?
  • ¿Cómo descomprimir archivos zip AES-256 encriptados?
  • Osmdroid - cambiar la carpeta del mapa local
  • Archivo sin conexión de Osmdroid
  • Cómo android almacena y ejecuta programas
  • ¿Es posible mostrar svgz en Android?
  • FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.