34

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

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

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

  1. 为什么它只在第一次工作?
  2. 那个错误是什么意思?
  3. 为什么我只在 Xoom 上收到此错误?

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

日志猫:

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 的华硕变压器的错误

4

7 回答 7

78

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

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

重命名代码:

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

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

于 2012-08-02T11:27:05.810 回答
6

这个问题可能是由于

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

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

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

你可以一步一步:

在删除文件之前,您应该

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

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

比,

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

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

祝你好运!

于 2014-02-18T11:41:31.090 回答
2

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

于 2012-10-26T07:34:02.643 回答
2

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

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

于 2013-12-22T12:33:19.507 回答
0

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

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

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

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

于 2014-01-27T22:57:54.553 回答
0

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

于 2016-01-18T19:51:16.623 回答
0

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

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

于 2017-04-11T13:49:39.323 回答