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

Inf*_*0re 34 android inputstream unzip

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

在我的应用程序中,可以下载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
Run Code Online (Sandbox Code Playgroud)

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

FileHelper.copy(zipFile.getInputStream(entry), new FileOutputStream(outputFile), modify);
Run Code Online (Sandbox Code Playgroud)

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

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

编辑:我们发现,它不仅是Xoom.我们还使用版本4.0.4的Asus Transformer出错

Inf*_*0re 77

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

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

要重命名的代码:

final File to = new File(file.getAbsolutePath() + System.currentTimeMillis());
file.renameTo(to);
to.delete();
Run Code Online (Sandbox Code Playgroud)

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

  • 结合下面的caopeng的答案,我已经搞砸了这个,看起来像用户media_rw所拥有的sdcard进程有一个链接到一个已删除的文件,它锁定了一切.任何人都有更好的想法为什么会发生这种情况,而不是在写作过程中重新启动/意外断电?删除之前重命名听起来像黑客:( (2认同)

cao*_*eng 6

这个问题可能是由于

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

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

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

你可以一步一步:

在删除文件之前,你应该

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

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

比,

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

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

祝好运!