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

Posted

技术标签:

【中文标题】打开失败:EBUSY(设备或资源忙)【英文标题】:open failed: EBUSY (Device or resource busy) 【发布时间】:2012-07-17 09:17:39 【问题描述】:

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

在我的应用程序中,可以下载一个 zipFile,按原样读取内容并删除它。它到底是什么并不重要。

问题:只有在摩托罗拉 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

它在我的 ZipHelper 类的第 35 行崩溃:

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

getInputStream(entry) ...我真的不知道为什么?

有没有一种方法可以在设备繁忙时等待设备或追索权? 每次我尝试解压缩文件时都会发生这种情况,应用程序会尝试 5 次(下载 - > 解压缩)并且每次都会崩溃。

编辑:我们发现,它不仅仅是 Xoom。我们也有版本 4.0.4 的华硕 Transformer 的错误

【问题讨论】:

我也有同样的问题。 “root explorer”应用已打开。 【参考方案1】:

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

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

重命名代码:

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

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

【讨论】:

有什么理由使用 getAbsolutePath() 而不是 getPath()? 没有理由,只是为了使用这个文件的完整路径,我认为它也可以使用getPath()。没有保修:) @Mirko 在通过另一个应用程序删除某些内容时有什么解决方法的想法吗? (即通过文件管理器应用从系统中删除文件的用户) 此解决方案只是删除(应用程序的)已知文件。如果有人用其他应用删除文件,你无能为力,只需将文件保存在应用的私有磁盘空间中即可 结合下面 caopeng 的答案,我已经搞砸了,看起来用户 media_rw 拥有的 sdcard 进程有一个指向已删除文件的链接,该文件正在锁定所有内容。任何人都知道为什么会发生这种情况,而不是在写作过程中出现不良重启/意外断电? Rename-before-delete 听起来像是 hack :(【参考方案2】:

这似乎是一个挥之不去的文件系统锁。我没有接触我的代码就修复了它,我认为是通过拔下我的 USB 电缆并重新插入它。

【讨论】:

在“重命名之前删除它”规则之后,我再也没有遇到过错误。所以我无法测试你的解决方案,我也不确定设备是否总是用 USB 插入。 帮帮我,有锁,重新插上解决了,谢谢【参考方案3】:

遇到完全相同的错误,尝试拔下电源、重新启动 Eclipse 等,但没有任何效果。最后不得不重新启动手机,一切都恢复原状;)

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

【讨论】:

【参考方案4】:

当目录中的文件在写入一些内容后没有关闭并且我正在尝试访问(修改/删除)目录时,我注意到 Sony Xperia 中的此错误。

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

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

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

【讨论】:

【参考方案5】:

这个问题可能是由于

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

文件已删除,但引用没有被杀死

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

你可以一步一步来:

在你删除文件之前你应该

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

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

比,

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

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

祝你好运!

【讨论】:

【参考方案6】:

我知道这是一个老问题,最初是针对 XOOM 报告的,但如果 OP 有一个未正确关闭的打开 FileOutputStream,即通过 finally 块,那么这很可能是导致资源的原因稍后尝试引用它时保留...即使实际删除了物理文件。

【讨论】:

【参考方案7】:

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

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

【讨论】:

以上是关于打开失败:EBUSY(设备或资源忙)的主要内容,如果未能解决你的问题,请参考以下文章

错误:EBUSY:资源繁忙或锁定,rmdir

avrdude:ser_open():无法打开设备“/dev/ttyACM0”:设备或资源忙

EBUSY:资源繁忙或锁定,lstat 'C:\hiberfil.sys'

EBUSY:资源繁忙或锁定,重命名。

获取错误EBUSY:资源繁忙或已锁定

vuejs - 来自 chokidar (C:\) 的错误:错误:EBUSY:资源繁忙或锁定,lstat 'C:\hiberfil.sys'