打开失败:EBUSY(设备或资源忙)

我的应用程序中有一个奇怪的错误。

在我的应用程序可以下载一个zip文件,阅读它的内容,也删除它。 不pipe它到底是什么。

问题:只有在摩托罗拉Xoom(版本4.0.4)我可以下载文件,解压缩,我可以读取数据,我可以删除一切。 但是,如果我尝试再次下载该文件,并在解压文件并将文件复制到SD卡时崩溃,并出现错误EBUSY(设备或资源繁忙)。

  1. 为什么只有第一次工作?
  2. 这意味着什么错误?
  3. 为什么我只在Xoom上得到这个错误?

我找不到任何解决scheme。 在所有其他设备上,它工作正常,没有错误或问题。

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(入口)…我真的不知道为什么?

有什么方法可以等待设备或追踪,当它忙? 这是每次我尝试解压缩文件时,应用程序尝试5次(下载 – >解压缩),每次崩溃。

编辑:我们发现,它不仅Xoom。 我们也有与4.0.4版本的华硕变压器的错误

我有很大的答案! 问题来自Android系统或/和FAT32系统。 我无法解释系统如何得到错误,这与删除文件和FAT32系统有关。

但是解决scheme非常简单:删除目录或文件之前:重命名它!

代码重命名:

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

这就是说,如果您在删除文件夹或文件之前重命名该文件夹或文件,则系统不会尝试再次打开现有文件或打开一个您想要保存的文件(或类似的东西)。

这个问题可能是由于

  • 两个或多个进程引用同一个文件

  • 文件被删除,但引用不会被杀死

但是,删除它,只有一个引用被杀死,或者一个或多个进程也引用这个文件

你可以一步一步来:

你应该删除文件之前

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

您打开的文件以及哪个进程引用了您打开的文件。 同样,这个命令给我们显示进程ID

比,

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

惊喜等着你,O(∩_∩)O

祝你好运!

这似乎是一个挥之不去的文件系统锁。 我修好了它,而不接触我的代码,我认为这是拔掉我的USB电缆,并重新插入。

得到完全相同的错误,试图拔掉插头,重新启动日食等,但没有任何工作。 最后不得不重新启动手机,并全部倒回原位;)

感谢您把我放在正确的路线!

我注意到索尼Xperia中的错误,当目录中的文件没有closures后写入一些内容,我试图访问(修改/删除)的目录。

确保正确closures文件。 确保没有程序正在访问您的文件。 那么你不会遇到这个错误。

如果您不确定任何程序可能正在访问您的目录,请确保在删除目录之前删除(/closures)目录中的所有文件。

adb reboot是closures打开的文件的一个选项。 但这不是一个好的select。

我知道这是一个老问题,最初报告特定于XOOM,但是如果OP有一个打开的FileOutputStream没有正确closures,即通过Finally块,那么这可能是导致资源被占用的原因当稍后尝试引用它时…即使物理文件被实际删除。

消息rm: could not remove directory (code EBUSY) ,意味着某些应用程序或进程正在使用该目录。

对我来说,这通常意味着AndroidStudio,Webstorm或其他IDE已经打开。 如果您打开了一个IDE,closures它可以释放该进程以删除该文件夹。 closures后,再次运行删除。