android inputstream unzip

android - abierto fallido: EBUSY(dispositivo o recurso ocupado)



inputstream unzip (7)

El mensaje rm: could not remove directory (code EBUSY) , significa que alguna aplicación o proceso está usando el directorio.

Para mí, esto generalmente significa que AndroidStudio, Webstorm u otro IDE está abierto. Si tiene un IDE abierto, cerrarlo puede liberar el proceso para eliminar la carpeta. Después del cierre, simplemente ejecuta la eliminación nuevamente.

Tengo un error extraño en mi aplicación.

En mi aplicación, es posible descargar un archivo zip, leer el contenido tal como es y también eliminarlo. No importa qué es exactamente.

Problema: solo en Motorola Xoom (versión 4.0.4) puedo descargar el archivo, descomprimirlo, puedo leer los datos y puedo borrar todo. Pero si trato de descargar el archivo nuevamente y mientras descomprime el archivo y copia los archivos en la tarjeta SD, se bloquea con el error EBUSY (Dispositivo o recurso ocupado).

  1. ¿Por qué funciona solo la primera vez?
  2. ¿Qué significa ese error?
  3. ¿Por qué me sale este error solo en Xoom?

No puedo encontrar ninguna solución para eso. En todos los demás dispositivos funciona bien, sin errores ni problemas.

LogCat:

07-18 12:27:46.774: E/PrepareMagTask(10057): IOException 07-18 12:27:46.774: E/PrepareMagTask(10057): java.io.FileNotFoundException: /mnt/sdcard/Android/data/com.xxxxxx.android/files/content/23760/emag.db: open failed: EBUSY (Device or resource busy) 07-18 12:27:46.774: E/PrepareMagTask(10057): at libcore.io.IoBridge.open(IoBridge.java:406) 07-18 12:27:46.774: E/PrepareMagTask(10057): at java.io.FileOutputStream.<init>(FileOutputStream.java:88) 07-18 12:27:46.774: E/PrepareMagTask(10057): at java.io.FileOutputStream.<init>(FileOutputStream.java:73) 07-18 12:27:46.774: E/PrepareMagTask(10057): at com.xxxxx.android.util.io.ZipHelper.uncompressEntry(ZipHelper.java:35) 07-18 12:27:46.774: E/PrepareMagTask(10057): at com.xxxxx.android.task.PrepareMagTask.doInBackground(PrepareMagTask.java:271) 07-18 12:27:46.774: E/PrepareMagTask(10057): at com.xxxxx.android.task.PrepareMagTask.doInBackground(PrepareMagTask.java:1) 07-18 12:27:46.774: E/PrepareMagTask(10057): at android.os.AsyncTask$2.call(AsyncTask.java:264) 07-18 12:27:46.774: E/PrepareMagTask(10057): at java.util.concurrent.FutureTask$Sync.innerRun(FutureTask.java:305) 07-18 12:27:46.774: E/PrepareMagTask(10057): at java.util.concurrent.FutureTask.run(FutureTask.java:137) 07-18 12:27:46.774: E/PrepareMagTask(10057): at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1076) 07-18 12:27:46.774: E/PrepareMagTask(10057): at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:569) 07-18 12:27:46.774: E/PrepareMagTask(10057): at java.lang.Thread.run(Thread.java:856) 07-18 12:27:46.774: E/PrepareMagTask(10057): Caused by: libcore.io.ErrnoException: open failed: EBUSY (Device or resource busy) 07-18 12:27:46.774: E/PrepareMagTask(10057): at libcore.io.Posix.open(Native Method) 07-18 12:27:46.774: E/PrepareMagTask(10057): at libcore.io.BlockGuardOs.open(BlockGuardOs.java:110) 07-18 12:27:46.774: E/PrepareMagTask(10057): at libcore.io.IoBridge.open(IoBridge.java:390) 07-18 12:27:46.774: E/PrepareMagTask(10057): ... 11 more

Se bloquea en la línea 35 en mi clase ZipHelper:

FileHelper.copy(zipFile.getInputStream(entry), new FileOutputStream(outputFile), modify);

getInputStream (entrada) ... y realmente no sé por qué?

¿Hay un método para esperar el dispositivo o recurso, cuando está ocupado? Esto sucede cada vez que intento descomprimir el archivo, la aplicación lo intenta 5 veces (Descargando -> Descomprimir) y se cuelga todo el tiempo.

EDITAR: descubrimos que no es solo el Xoom. También tenemos el error con el transformador Asus con la versión 4.0.4


Entiendo que este es un problema antiguo, y que originalmente se informó que era específico de XOOM, pero si el OP tenía un FileOutputStream abierto que no se cerró correctamente, es decir, a través de un bloque Finally, es probable que lo que está causando el recurso se mantenga cuando intente hacer referencia más adelante ... incluso si el archivo físico fue realmente eliminado.


Estaba recibiendo exactamente el mismo error, intenté desconectar, reiniciar eclipse, etc. pero nada funcionaba. Finalmente tuve que reiniciar el teléfono y todo volvió a su lugar;)

¡Gracias por ponerme en la ruta correcta!


Este problema puede ser causado por

  • dos o más procesos hacen referencia al mismo archivo

  • archivo fue eliminado, pero la referencia no se matará

Sin embargo, lo eliminó, solo se eliminó una referencia, o uno o más procesos hicieron referencia a este archivo también

puedes paso a paso:

antes de eliminar el archivo, deberías

  • adb shell lsof | grep "com.xxxxxx.android"

El archivo que ha sido abierto, y qué proceso hace referencia al archivo que abrió. Además, este comando, nos muestra el ID del proceso

que,

  • adb shell ls -al /proc/%d/fd

Sorpresa esperándote, O (∩_∩) O

¡buena suerte!


Me di cuenta de este error en Sony Xperia cuando el archivo en el directorio no se cerró después de escribir algo de contenido y estoy tratando de acceder (modificar / eliminar) el directorio.

Asegúrese de cerrar el archivo correctamente. Asegúrese de que ningún programa acceda a sus archivos. Entonces no encontrarás este error.

Si no está seguro de que algún programa pueda acceder a su directorio, asegúrese de eliminar (/ cerrar) todos los archivos en el directorio antes de eliminar el directorio.

El reinicio de adb es una opción para cerrar archivos abiertos. Pero esa no es una buena opción para hacerlo.


Parece ser un bloqueo persistente del sistema de archivos. Lo arreglé sin tocar mi código, creo que fue desenchufando mi cable USB y volviéndolo a enchufar.


Tengo la gran respuesta !! El problema proviene del sistema Android y / o del sistema FAT32. No puedo explicar cómo el sistema obtiene el error, tiene algo que ver con la eliminación de archivos y el sistema FAT32.

Pero la solución es realmente fácil: antes de eliminar un Directorio o Archivo: ¡renómbrelo!

Código para cambiar el nombre:

final File to = new File(file.getAbsolutePath() + System.currentTimeMillis()); file.renameTo(to); to.delete();

Eso es todo, si cambia el nombre de la carpeta o archivo antes de eliminarlo, no hay ninguna posibilidad de que el sistema intente abrir un archivo existente de nuevo o un archivo abierto que desee volver a guardar (o algo así).