wake-up-neo.net

öffnen fehlgeschlagen: EBUSY (Gerät oder Ressource beschäftigt) 

Ich habe einen seltsamen Fehler in meiner App.

In meiner App ist es möglich, eine zipFile herunterzuladen, den Inhalt so zu lesen, wie er ist, und ihn auch zu löschen. Es ist egal was genau es ist. 

Problem: Nur auf dem Motorola Xoom (Version 4.0.4) kann ich die Datei herunterladen, entpacken, ich kann die Daten lesen und ich kann alles löschen, aber wenn ich versuche, die Datei erneut herunterzuladen und sie dabei zu entpacken Datei und kopieren Sie die Dateien auf die SD-Karte, stürzt sie ab mit dem Fehler EBUSY (Gerät oder Ressource beschäftigt).

  1. Warum funktioniert es nur beim ersten Mal?
  2. Was bedeutet dieser Fehler? 
  3. Warum erhalte ich diesen Fehler nur beim Xoom?

Ich kann dafür keine Lösung finden. Auf allen anderen Geräten funktioniert es einwandfrei, keine Fehler oder Probleme. 

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

Es stürzt in Zeile 35 meiner ZipHelper-Klasse ab:

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

getInputStream (entry) ... und ich weiß wirklich nicht warum? 

Gibt es eine Methode zum Warten auf das Gerät oder den Abruf, wenn es beschäftigt ist? Dies geschieht jedes Mal, wenn ich versuche, die Datei zu entpacken. Die App versucht es fünfmal (Herunterladen -> Entpacken) und stürzt jedes Mal ab. 

EDIT: Wir haben herausgefunden, dass es nicht nur der Xoom ist. Wir haben auch den Fehler mit dem Asus Transformer mit der Version 4.0.4

34
Informatic0re

Ich habe eine große Antwort! Das Problem kommt vom Android-System bzw. vom FAT32-System. Ich kann nicht erklären, wie das System den Fehler erhält, es hat etwas mit dem Löschen von Dateien und dem FAT32-System zu tun.

Die Lösung ist jedoch sehr einfach: Bevor Sie ein Verzeichnis oder eine Datei löschen: Umbenennen!

Code zum Umbenennen:

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

Wenn Sie den Ordner oder die Datei umbenennen, bevor Sie sie löschen, besteht keine Möglichkeit für das System, eine vorhandene Datei oder eine geöffnete Datei erneut zu öffnen, die Sie erneut speichern möchten (oder ähnliches).

77
Informatic0re

Dieses Problem kann von verursacht werden

  • zwei oder mehr Prozessreferenzen auf dieselbe Datei

  • Datei wurde gelöscht, aber der Verweis wird nicht abgebrochen

Bei der Löschung wurde jedoch nur eine Referenz abgebrochen, oder eine oder mehrere Process-Referenz für diese Datei

sie können Schritt für Schritt:

bevor Sie die Datei löschen, sollten Sie dies tun

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

Die Datei, die Sie geöffnet haben, und welcher Prozess referenziert die Datei, die Sie geöffnet haben. Auch dieser Befehl zeigt uns die Prozess-ID

als,

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

Überraschung wartet auf dich, O (∩_∩) O

viel Glück!

6
caopeng

Es scheint eine anhaltende Dateisperre zu sein. Ich habe es repariert, ohne meinen Code zu berühren. Ich denke, es war durch Ziehen des USB-Kabels und anschließendes erneutes Einstecken.

2
Jay Bobzin

Bekam genau den gleichen Fehler, versuchte das Entfernen von Eclipse usw., aber es funktionierte nichts. Endlich musste das Telefon neu gestartet werden und alles fiel wieder in Position;)

Danke, dass du mich auf die richtige Route gebracht hast !!

2
Laurie Clark

Ich verstehe, dass dies ein altes Problem ist und ursprünglich spezifisch für ein XOOM berichtet wurde, aber wenn das OP einen offenen FileOutputStream hatte, der nicht ordnungsgemäß geschlossen wurde, z. B. über einen finally-Block, dann ist es wahrscheinlich, dass die Ressource angehalten wird Wenn Sie versuchen, später darauf zu verweisen, auch wenn die physische Datei tatsächlich gelöscht wurde.

0
ShellDude

Ich habe diesen Fehler in Sony Xperia bemerkt, als die Datei im Verzeichnis nach dem Schreiben von Inhalten nicht geschlossen wurde und ich versuche, auf das Verzeichnis zuzugreifen. 

Stellen Sie sicher, dass die Datei ordnungsgemäß geschlossen wird. Stellen Sie sicher, dass kein Programm auf Ihre Dateien zugreift. Dann stößt man nicht auf diesen Fehler.

Wenn Sie nicht sicher sind, ob ein Programm auf Ihr Verzeichnis zugreift, müssen Sie alle Dateien im Verzeichnis löschen (/ schließen), bevor Sie das Verzeichnis löschen. 

adb-Neustart ist eine Option zum Schließen geöffneter Dateien. Dies ist jedoch keine gute Option. 

0
Venkatesh

Die Nachricht rm: could not remove directory (code EBUSY) bedeutet, dass eine App oder ein Prozess das Verzeichnis verwendet. 

Für mich bedeutet das normalerweise, dass AndroidStudio, Webstorm oder eine andere IDE geöffnet ist. Wenn Sie eine IDE geöffnet haben, können Sie beim Schließen den Ordner entfernen. Nach dem Schließen führen Sie einfach die Entfernung erneut aus.

0
farrellw