web-dev-qa-db-ja.com

オープンに失敗しました:EBUSY(デバイスまたはリソースがビジー)

アプリに奇妙なエラーがあります。

私のアプリでは、zipFileをダウンロードし、コンテンツをそのまま読み、削除することもできます。正確に何であるかは関係ありません。

問題:Motorola Xoom(バージョン4.0.4)でのみ、ファイルをダウンロードして解凍し、データを読み取ってすべてを削除できます。しかし、ファイルを再度ダウンロードしようとして、ファイルを解凍してファイルをSDカードにコピーすると、エラーEBUSY(デバイスまたはリソースがビジー)でクラッシュします。

  1. なぜ初めて動作するのですか?
  2. そのエラーはどういう意味ですか?
  3. 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

ZipHelperクラスの35行目でクラッシュします。

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

getInputStream(entry)...そして、なぜ私は本当に知らないのですか?

デバイスがビジーのときに、デバイスまたはリソースを待機する方法はありますか?これは、ファイルを解凍しようとするたびに発生し、アプリは5回(ダウンロード->解凍)試行し、毎回クラッシュします。

編集:Xoomだけでなく、そのことがわかりました。バージョン4.0.4のAsus Transformerでもエラーが発生します

34
Informatic0re

大きな答えがあります!!問題は、Android Systemまたは/およびFAT32システムから発生します。システムがエラーを取得する方法を説明できません。ファイルとFAT32システムの削除に関係しています。

しかし、解決策は本当に簡単です。ディレクトリまたはファイルを削除する前に、名前を変更してください!

名前を変更するコード:

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

削除する前にフォルダーまたはファイルの名前を変更した場合、システムが既存のファイルを再度開こうとしたり、保存したいファイル(またはこのようなもの)を開こうとする可能性はありません。

77
Informatic0re

この問題の原因は

  • 2つ以上のプロセスが同じファイルを参照

  • ファイルは削除されましたが、参照は削除されません

ただし、削除したのは、1つの参照のみが削除された、または1つ以上プロセスがこのファイルも参照した

次の手順を実行できます。

ファイルを削除する前に

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

開いているファイル、および開いているファイルを参照しているプロセス。また、このコマンドは、プロセスIDを表示します

より、

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

あなたを待っているサプライズ、O(∩_∩)O

幸運を!

6
caopeng

ファイルシステムのロックが残っているようです。コードに触れずに修正しました。USBケーブルを抜き、再度差し込んだためだと思います。

2
Jay Bobzin

まったく同じエラーが表示され、プラグを抜いて、Eclipseを再起動しようとしましたが、何も機能していませんでした。最終的に電話を再起動する必要があり、すべてが元の場所に落ちました;)

正しいルートに私を置いてくれてありがとう!!

2
Laurie Clark

これは古い問題であり、もともとXOOMに固有であると報告されていましたが、OPが開いているFileOutputStreamが適切に閉じられていなかった場合(つまり、Finallyブロックを介して)後で参照しようとしたとき...物理ファイルが実際に削除された場合でも。

0
ShellDude

Sony Xperiaでこのエラーに気づいたのは、ディレクトリ内のファイルにコンテンツを書き込んだ後に閉じられず、ディレクトリにアクセス(変更/削除)しようとしています。

ファイルを適切に閉じてください。プログラムがファイルにアクセスしていないことを確認してください。その後、このエラーに遭遇することはありません。

プログラムがディレクトリにアクセスしている可能性があるかどうか不明な場合は、ディレクトリを削除する前に、ディレクトリ内のすべてのファイルを必ず削除(/閉じる)してください。

adb rebootは、開いているファイルを閉じるための1つのオプションです。しかし、そうするのは良い選択肢ではありません。

0
Venkatesh

メッセージrm: could not remove directory (code EBUSY)は、一部のアプリまたはプロセスがディレクトリを使用していることを意味します。

私にとって、これは通常、AndroidStudio、Webstorm、または別のIDEが開いていることを意味します。IDE開いている場合、閉じると、フォルダーを閉じた後、もう一度削除を実行します。

0
farrellw