Подтвердить что ты не робот

Open failed: EBUSY (занятое устройство или ресурс)

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

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

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

  • Почему он работает только в первый раз?
  • Что означает эта ошибка?
  • Почему я получаю эту ошибку только на 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

4b9b3361

Ответ 1

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

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

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

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

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

Ответ 2

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

  • два или более ссылки на процесс одного и того же файла

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

Однако, удалив его, была убита только одна ссылка, или один или несколько ссылаются на этот файл также

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

перед удалением файла, который вы должны

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

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

чем,

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

Сюрприз ждет вас, O (∩_∩) O

Удачи!

Ответ 3

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

Ответ 4

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

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

Ответ 5

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

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

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

adb reboot - это один из способов закрыть открытые файлы. Но это не очень хорошо.

Ответ 6

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

Ответ 7

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

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