Tengo una carpeta zip en mi tarjeta SD, ¿cómo descomprimo la carpeta (dentro de mi código de aplicación)?Android - ¿Descomprimir una carpeta?
Respuesta
static Handler myHandler;
ProgressDialog myProgress;
public void unzipFile(File zipfile) {
myProgress = ProgressDialog.show(getContext(), "Extract Zip",
"Extracting Files...", true, false);
File zipFile = zipfile;
String directory = null;
directory = zipFile.getParent();
directory = directory + "/";
myHandler = new Handler() {
@Override
public void handleMessage(Message msg) {
// process incoming messages here
switch (msg.what) {
case 0:
// update progress bar
myProgress.setMessage("" + (String) msg.obj);
break;
case 1:
myProgress.cancel();
Toast toast = Toast.makeText(getContext(),
"Zip extracted successfully",
Toast.LENGTH_SHORT);
toast.show();
provider.refresh();
break;
case 2:
myProgress.cancel();
break;
}
super.handleMessage(msg);
}
};
Thread workthread = new Thread(new UnZip(zipFile, directory));
workthread.start();
}
public class UnZip implements Runnable {
File archive;
String outputDir;
public UnZip(File ziparchive, String directory) {
archive = ziparchive;
outputDir = directory;
}
public void log(String log) {
Log.v("unzip", log);
}
@SuppressWarnings("unchecked")
public void run() {
Message msg;
try {
ZipFile zipfile = new ZipFile(archive);
for (Enumeration e = zipfile.entries();
e.hasMoreElements();) {
ZipEntry entry = (ZipEntry) e.nextElement();
msg = new Message();
msg.what = 0;
msg.obj = "Extracting " + entry.getName();
myHandler.sendMessage(msg);
unzipEntry(zipfile, entry, outputDir);
}
} catch (Exception e) {
log("Error while extracting file " + archive);
}
msg = new Message();
msg.what = 1;
myHandler.sendMessage(msg);
}
@SuppressWarnings("unchecked")
public void unzipArchive(File archive, String outputDir) {
try {
ZipFile zipfile = new ZipFile(archive);
for (Enumeration e = zipfile.entries();
e.hasMoreElements();) {
ZipEntry entry = (ZipEntry) e.nextElement();
unzipEntry(zipfile, entry, outputDir);
}
} catch (Exception e) {
log("Error while extracting file " + archive);
}
}
private void unzipEntry(ZipFile zipfile, ZipEntry entry,
String outputDir) throws IOException {
if (entry.isDirectory()) {
createDir(new File(outputDir, entry.getName()));
return;
}
File outputFile = new File(outputDir, entry.getName());
if (!outputFile.getParentFile().exists()) {
createDir(outputFile.getParentFile());
}
log("Extracting: " + entry);
BufferedInputStream inputStream = new
BufferedInputStream(zipfile
.getInputStream(entry));
BufferedOutputStream outputStream = new BufferedOutputStream(
new FileOutputStream(outputFile));
try {
IOUtils.copy(inputStream, outputStream);
} finally {
outputStream.close();
inputStream.close();
}
}
private void createDir(File dir) {
log("Creating dir " + dir.getName());
if (!dir.mkdirs())
throw new RuntimeException("Can not create dir " + dir);
}
}
Esto es lo que funcionó para mí gracias gente
¿Qué es el caso 2 en handleMessage()? No veo ningún msg.what = 2. – Turnsole
que funcione para mí, pero si descargo el archivo zip del servidor y luego lo descomprimo, me muestra el error java.util.zip.ZipException: EOCD no encontrado, no tengo cualquier idea al respecto –
estoy usando una versión modificada del método para principiantes que se extiende AsyncTask y puede actualizar Observadores en el hilo principal. La compresión byte por byte es extremadamente lenta y debe evitarse. En cambio, un enfoque más eficiente es copiar grandes fragmentos de datos a la secuencia de salida.
package com.blarg.webviewscroller;
import java.io.BufferedInputStream;
import java.io.BufferedOutputStream;
import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
import java.util.Enumeration;
import java.util.Observable;
import java.util.zip.ZipEntry;
import java.util.zip.ZipFile;
import org.apache.commons.io.IOUtils;
import android.os.AsyncTask;
import android.util.Log;
public class UnZipper extends Observable {
private static final String TAG = "UnZip";
private String mFileName, mFilePath, mDestinationPath;
public UnZipper (String fileName, String filePath, String destinationPath) {
mFileName = fileName;
mFilePath = filePath;
mDestinationPath = destinationPath;
}
public String getFileName() {
return mFileName;
}
public String getFilePath() {
return mFilePath;
}
public String getDestinationPath() {
return mDestinationPath;
}
public void unzip() {
String fullPath = mFilePath + "/" + mFileName + ".zip";
Log.d(TAG, "unzipping " + mFileName + " to " + mDestinationPath);
new UnZipTask().execute(fullPath, mDestinationPath);
}
private class UnZipTask extends AsyncTask<String, Void, Boolean> {
@SuppressWarnings("rawtypes")
@Override
protected Boolean doInBackground(String... params) {
String filePath = params[0];
String destinationPath = params[1];
File archive = new File(filePath);
try {
ZipFile zipfile = new ZipFile(archive);
for (Enumeration e = zipfile.entries(); e.hasMoreElements();) {
ZipEntry entry = (ZipEntry) e.nextElement();
unzipEntry(zipfile, entry, destinationPath);
}
} catch (Exception e) {
Log.e(TAG, "Error while extracting file " + archive, e);
return false;
}
return true;
}
@Override
protected void onPostExecute(Boolean result) {
setChanged();
notifyObservers();
}
private void unzipEntry(ZipFile zipfile, ZipEntry entry,
String outputDir) throws IOException {
if (entry.isDirectory()) {
createDir(new File(outputDir, entry.getName()));
return;
}
File outputFile = new File(outputDir, entry.getName());
if (!outputFile.getParentFile().exists()) {
createDir(outputFile.getParentFile());
}
Log.v(TAG, "Extracting: " + entry);
BufferedInputStream inputStream = new BufferedInputStream(zipfile.getInputStream(entry));
BufferedOutputStream outputStream = new BufferedOutputStream(new FileOutputStream(outputFile));
try {
IOUtils.copy(inputStream, outputStream);
} finally {
outputStream.close();
inputStream.close();
}
}
private void createDir(File dir) {
if (dir.exists()) {
return;
}
Log.v(TAG, "Creating dir " + dir.getName());
if (!dir.mkdirs()) {
throw new RuntimeException("Can not create dir " + dir);
}
}
}
}
Es utilizado por una clase que implementa Observer
, tales como:
private void unzipWebFile(String filename) {
String unzipLocation = getExternalFilesDir(null) + "/unzipped";
String filePath = Environment.getExternalStorageDirectory().toString();
UnZipper unzipper = new UnZipper(filename, filePath, unzipLocation);
unzipper.addObserver(this);
unzipper.unzip();
}
Su observador obtendrá una update(Observable observable, Object data)
devolución de llamada cuando termina descomprimir.
Esta debería ser la respuesta aceptada. – Prateek
¿Dónde obtener IOUtils y cómo instalarlo? –
'IOUtils' es parte de Apache Commons IO https://commons.apache.org/proper/commons-io/ –
sólo "complemento" para @ rich.e respuesta:
en doInBackground()
después de la iteración a través ZipEtries debe cerrar el archivo, porque a veces no desea eliminar el archivo después de descomprimir y lanza una excepción si el archivo fue no cerrado:
try {
ZipFile zipfile = new ZipFile(archive);
int entries = zipfile.size();
int total = 0;
if(onZipListener != null)
onZipListener.onUncompressStart(archive);
for (Enumeration<?> e = zipfile.entries(); e.hasMoreElements();) {
ZipEntry entry = (ZipEntry) e.nextElement();
if(onZipListener != null)
onZipListener.onUncompressProgress(archive, (int) (total++ * 100/entries));
unzipEntry(zipfile, entry, path);
}
zipfile.close();
} catch (Exception e) {
e.printStackTrace();
}
- 1. ¿Cómo puedo descomprimir una carpeta específica?
- 2. Java ZIP - ¿cómo descomprimir la carpeta?
- 3. Cómo descomprimir una carpeta zip usando el código php
- 4. JavaScript: Descomprimir/inflar/descomprimir/descomprimir cadenas
- 5. Cómo descomprimir carpeta en la aplicación IOS para iPhone
- 6. Cómo descargar y descomprimir la carpeta .ZIP con Adobe Air?
- 7. Android: descomprimir archivos zip codificados con contraseña
- 8. ¿Cómo descomprimir un archivo 7zip en Android?
- 9. Android: Cómo descomprimir un archivo zip encriptado
- 10. ¿Cómo seleccionar una carpeta en android?
- 11. ¿Podemos encriptar una carpeta en android?
- 12. Cómo descomprimir/descomprimir dentro de Emacs
- 13. descomprimir solo la extensión específica
- 14. ¿Hay una biblioteca para descomprimir archivos .Z usando VB.NET?
- 15. Comprimir y descomprimir carpetas en C#
- 16. Cómo "descomprimir" una estructura en haskell
- 17. Cómo descomprimir una solicitud de NSURLConnection?
- 18. Descomprimir el archivo BZIP2
- 19. Mover una carpeta completa desde Windows al emulador de Android
- 20. obtener la ruta de una carpeta de galería en Android
- 21. archivo Descomprimir ZIP y extraer el contenido del nombre de la carpeta desconocida
- 22. ¿Cómo descomprimir archivos recursivamente en Java?
- 23. ¿Cómo descomprimir xlsx?
- 24. Descomprimir GZip en Haskell
- 25. Descomprimir archivos de una manera más rápida que usando java.util.zip en Android
- 26. Organizar carpeta src Android en subcarpetas (Eclipse)
- 27. No hay depuración.keystore en la carpeta .android
- 28. ¿Dónde se encuentra la carpeta Android SDK?
- 29. carpeta ".android" y el archivo 'debug.keystore' falta
- 30. Android: comprensión de la carpeta dibujable
Supongo que ha agregado el permiso para acceder al almacenamiento externo? – Kurru