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

时间:2012-07-18 10:50:13

标签: android inputstream unzip

我的应用程序中出现了一个奇怪的错误。

在我的应用程序中,可以下载zipFile,阅读内容,并删除它。它究竟是什么并不重要。

问题:仅在Motorola Xoom(版本4.0.4)上我可以下载文件,解压缩,我可以读取数据,我可以删除所有内容。 但是,如果我再次尝试下载文件并解压缩文件并将文件复制到SD卡,则会崩溃并显示错误EBUSY(设备或资源繁忙)。

  1. 为什么它只是第一次工作?
  2. 错误是什么意思?
  3. 为什么我只在Xoom上出现此错误?
  4. 我找不到任何解决方案。在所有其他设备上它工作正常,没有错误或问题。

    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的错误

7 个答案:

答案 0 :(得分:77)

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

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

要重命名的代码:

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

就是这样,如果在删除文件夹或文件之前重命名文件夹或文件,系统就不可能再次尝试打开现有文件,也不会再打开要再次保存的打开文件(或类似的东西)。

答案 1 :(得分:6)

此问题可能由

引起
  • 两个或多个流程引用相同的文件

  • 文件已删除,但引用未被删除

然而,删除它,只有一个引用被杀死,或一个或多个进程引用此文件

你可以一步一步:

删除文件之前

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

您已打开的文件以及哪个进程引用您打开的文件。 此命令,向我们显示进程ID

比,

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

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

祝你好运!

答案 2 :(得分:2)

这似乎是一个挥之不去的文件系统锁。我修好了它而没有碰到我的代码,我认为是通过拔掉我的USB线并重新插入它。

答案 3 :(得分:2)

得到完全相同的错误,尝试拔掉,重新启动eclipse等但没有任何工作。最后不得不重新启动手机,所有人都重新回到原位;)

感谢您让我走上正确的路线!!

答案 4 :(得分:0)

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

确保正确关闭文件。确保没有程序访问您的文件。然后你不会遇到这个错误。

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

adb reboot是关闭打开文件的一个选项。但这不是一个好的选择。

答案 5 :(得分:0)

我知道这是一个老问题,并且最初报告特定于XOOM,但是如果OP有一个未正确关闭的打开FileOutputStream,即通过Finally块,那么这可能是导致资源的原因在以后尝试引用它时要保持...即使物理文件实际上已被删除。

答案 6 :(得分:0)

消息rm: could not remove directory (code EBUSY)表示某个应用或进程正在使用该目录。

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