открыть не удалось: EBUSY (устройство или ресурс заняты)


У меня есть странная ошибка в моем приложении.

В моем приложении можно скачать zipFile, прочитать содержимое как оно есть, а также удалить его. Это не имеет значения, что именно это такое.

Проблема: только на Motorola Xoom (версия 4.0.4) я могу скачать файл, распаковать его, прочитать данные и удалить все. Но если я попытаюсь Загрузить файл еще раз и пока он распакует файл и скопирует файлы на SD-карту, он вылетит с ошибкой EBUSY (устройство или ресурс оживленный).

    Почему это работает только в первый раз? Что означает эта ошибка?
  1. Почему я получаю эту ошибку только на Xoom?
Я не могу найти никакого решения для этого. На всех остальных устройствах он работает нормально, без ошибок и проблем.

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

Он падает в строке 35 в моем классе ZipHelper:

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

GetInputStream (запись)... и я действительно не знаю, почему?

Есть ли способ дождаться устройства или регресса, когда оно занят? Это происходит каждый раз, когда я пытаюсь распаковать файл, приложение пытается это 5 раз (загрузка -> распаковать), и он падает каждый раз.

EDIT: мы выяснили, что это не только Xoom. У нас также есть ошибка с Asus Transformer с версией 4.0.4

7 34

7 ответов:

У меня есть большой ответ!! Проблема исходит от системы Android или / и системы FAT32. Я не могу объяснить, как система получает ошибку, она имеет какое-то отношение к удалению файлов и системе FAT32.

Но решение действительно простое: Прежде чем удалить каталог или файл: переименуйте его!

Код для переименования:

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

Вот и все, если вы переименуете папку или файл, прежде чем удалить его, то у системы не будет шанса попытаться открыть существующий файл снова или заново. откройте файл, который вы хотите сохранить снова (или что-то вроде этого).

Эта проблема может быть вызвана

  • Два или более процесса ссылаются на один и тот же файл

  • Файл был удален,но ссылка не была убита

Однако, удалил его, только одна ссылка была убита,или один или несколько процесс ссылки этот файл также

Вы можете шаг за шагом:

Перед удалением файла необходимо

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

Файл, который вы открыли,и какой процесс ссылка на файл, который вы открыли. кроме того, эта команда показывает нам идентификатор процесса

Чем,

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

Сюрприз ждет тебя, O (∩_) O

Удачи!

Похоже, это длительная блокировка файловой системы. Я исправил это, не касаясь моего кода, я думаю, что это было, отключив мой USB-кабель и повторно подключив его.

Получал точно такую же ошибку, пытался отключить, перезапустить eclipse и т. д., Но ничего не работало. Наконец пришлось перезагрузить телефон и все встало на свои места;)

Спасибо, что наставили меня на правильный путь !!

Я заметил эту ошибку в Sony Xperia, когда файл в каталоге не закрывается после записи в него некоторого содержимого, и я пытаюсь получить доступ(изменить/удалить) каталог.

Убедитесь, что файл закрыт правильно. Убедитесь, что ни одна программа не обращается к вашим файлам. Тогда вы не столкнетесь с этой ошибкой.

Если вы не уверены, что какая-либо программа может получить доступ к вашему каталогу, обязательно удалите(/закройте) все файлы в каталоге перед удалением каталога.

Перезагрузка Adb это один из вариантов закрытия открытых файлов. Но это не хороший вариант, чтобы сделать так.

Я понимаю, что это старая проблема, и первоначально сообщалось только о XOOM, но если у OP был открытый поток FileOutputStream, который не был должным образом закрыт, т. е. через блок Finally, то это, вероятно, то, что заставляет ресурс удерживаться при попытке ссылаться на него позже... даже если физический файл был фактически удален.

Сообщение rm: could not remove directory (code EBUSY), означает, что какое-то приложение или процесс использует каталог.

Для меня это обычно означает, что AndroidStudio, Webstorm или другая IDE открыта. Если у вас есть открытая среда IDE, ее закрытие может освободить процесс удаления папки. После закрытия просто запустите удаление еще раз.