web-dev-qa-db-fra.com

open failed: EBUSY (périphérique ou ressource occupé) 

J'ai une erreur étrange dans mon application.

Dans mon application, il est possible de télécharger un fichier zip, de lire le contenu en l'état et de le supprimer. Ce n'est pas grave ce que c'est exactement. 

Problème: Ce n’est que sur le Motorola Xoom (version 4.0.4) que je peux télécharger le fichier, le décompresser, lire les données et tout effacer . Mais si j’essaie de télécharger à nouveau le fichier et pendant le décompression, fichier et copier les fichiers sur la carte SD, il se bloque avec l’erreur EBUSY (périphérique ou ressource occupé).

  1. Pourquoi ça ne marche que la première fois?
  2. Que signifie cette erreur? 
  3. Pourquoi je reçois cette erreur uniquement sur le Xoom?

Je ne trouve pas de solution pour ça. Sur tous les autres appareils, cela fonctionne bien, pas d'erreur ni de problème. 

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

Il se bloque à la ligne 35 de ma classe de ZipHelper:

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

getInputStream (entry) ... et je ne sais vraiment pas pourquoi? 

Existe-t-il une méthode permettant d’attendre l’appareil ou le recours, quand il est occupé? C’est ce qui se produit chaque fois que je tente de décompresser le fichier, l’appareil l’essaye cinq fois (Téléchargement -> Décompresser) et il se bloque à chaque fois. 

EDIT: Nous avons découvert, ce n'est pas seulement le Xoom. Nous avons également l'erreur avec l'Asus Transformer avec la version 4.0.4

34
Informatic0re

J'ai une grande réponse !! Le problème vient du système Android ou/et du système FAT32. Je ne peux pas expliquer comment le système obtient l'erreur, cela a quelque chose à voir avec la suppression de fichiers et le système FAT32.

Mais la solution est très simple: Avant de supprimer un répertoire ou un fichier: renommez-le!

Code à renommer:

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

Si vous renommez le dossier ou le fichier avant de le supprimer, le système n'a aucune chance de tenter d'ouvrir à nouveau un fichier existant ou un fichier ouvert que vous souhaitez enregistrer à nouveau (ou quelque chose du genre).

77
Informatic0re

Ce problème peut être causé par

  • deux processus ou plus référencent le même fichier

  • le fichier a été supprimé, mais la référence ne doit pas être supprimée

Cependant, supprimé, une seule référence a été supprimée ou une ou plusieurs référence de processus ce fichier également

vous pouvez étape par étape:

avant de supprimer le fichier, vous devriez

  • adb Shell lsof | grep "com.xxxxxx.Android"

Le fichier que vous avez ouvert et quel processus fait référence au fichier que vous avez ouvert ..__ également, cette commande, nous montre l’identifiant du processus

que,

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

Surprise vous attend, O (_∩) O

bonne chance!

6
caopeng

Cela semble être un verrou persistant du système de fichiers. Je l'ai corrigé sans toucher mon code, je pense que c'était en débranchant mon câble USB et en le rebranchant.

2
Jay Bobzin

Je reçois exactement la même erreur, j'ai essayé de débrancher, de redémarrer Eclipse, etc. mais rien ne fonctionnait. Enfin dû redémarrer le téléphone et tout est retombé en place;)

Merci de m'avoir mis sur la bonne voie !!

2
Laurie Clark

Je comprends qu’il s’agit d’un problème ancien et qu’il avait été initialement signalé comme étant spécifique à un XOOM, mais si le PO avait un FileOutputStream ouvert qui n’était pas correctement fermé, c’est-à-dire via un bloc Finally, il est probable que le maintien de la ressource soit bloqué. lorsque vous essayez de le référencer plus tard ... même si le fichier physique a été réellement supprimé.

0
ShellDude

J'ai remarqué cette erreur dans Sony Xperia lorsque le fichier du répertoire n'était pas fermé après l'écriture de contenu et que j'essayais d'accéder au répertoire (modifier/supprimer). 

Assurez-vous de fermer le fichier correctement. Assurez-vous qu'aucun programme n'accède à vos fichiers. Ensuite, vous ne rencontrerez pas cette erreur.

Si vous n'êtes pas sûr qu'un programme puisse accéder à votre répertoire, veillez à supprimer (/ fermer) tous les fichiers du répertoire avant de le supprimer. 

le redémarrage d'adb est une option pour fermer les fichiers ouverts. Mais ce n’est pas une bonne option. 

0
Venkatesh

Le message rm: could not remove directory (code EBUSY), signifie qu'une application ou un processus utilise le répertoire. 

Pour moi, cela signifie généralement qu'AndroidStudio, Webstorm ou un autre IDE est ouvert. Si vous avez un IDE ouvert, sa fermeture peut libérer le processus pour supprimer le dossier. Après la fermeture, exécutez à nouveau la suppression.

0
farrellw