2012-07-18 118 views
34

我在我的應用程序中有一個奇怪的錯誤。打開失敗:EBUSY(設備或資源忙)

在我的應用程序中,可以下載一個zip文件,閱讀它的內容並刪除它。它無關緊要。

問題:只有在摩托羅拉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 

它崩潰,在第35行中我ZipHelper類:

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

的getInputStream(入門)......我真的不知道爲什麼?

有沒有一種方法來等待設備或追索,當它是忙? 這是每次我嘗試解壓縮文件時發生的,應用程序嘗試5次(下載 - >解壓縮)並且每次都崩潰。

編輯:我們發現,它不僅是Xoom。我們也有與華碩變壓器版本4.0.4的錯誤

+1

我有同樣的問題。 「根資源管理器」應用程序已打開。 – 2014-06-28 13:13:22

回答

77

我有這個大的答案! 問題來自Android系統或/和FAT32系統。 我無法解釋系統如何得到錯誤,這與刪除文件和FAT32系統有關。

但是解決方案非常簡單: 刪除目錄或文件之前:重命名它!

代號重新命名:

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

完蛋了,如果重命名的文件夾或刪除之前的文件,沒有機會使系統再次嘗試打開一個現有的文件或打開文件至極你想再次保存(或類似的東西)。

+1

任何使用getAbsolutePath()而不是getPath()的理由? – 2012-09-20 04:33:02

+0

沒有理由,只是使用這個文件的完整路徑,我認爲它也可以使用getPath()。沒有保修:) – Informatic0re 2012-09-20 08:35:42

+0

@Mirko任何想法的解決辦法,當某些東西被刪除通過另一個應用程序? (即通過文件管理器應用程序從系統中刪除文件的用戶) – 2013-10-09 16:03:55

2

它似乎是一個揮之不去的文件系統鎖。我修復了它,而沒有觸及我的代碼,我想這是拔掉我的USB電纜並重新插入它。

+0

我從來沒有在「重命名它刪除它」規則後再次出現錯誤。所以我無法測試您的解決方案,我也不確定設備是否總是使用USB插入。 – Informatic0re 2012-10-29 16:35:02

+0

沒有。沒有爲我工作。 – drulabs 2013-08-26 07:18:12

+0

幫助我,有一個鎖,通過重新插入解決,謝謝 – keybee 2013-08-27 10:36:57

2

得到完全相同的錯誤,試圖拔掉插頭,重新啓動eclipse等,但沒有任何工作。最後不得不重新啓動手機,並全部回落到位;)

感謝您把我放在正確的路線!

0

我注意到索尼Xperia中的這個錯誤,當目錄中的文件寫入一些內容後沒有關閉,我試圖訪問(修改/刪除)目錄。

確保正確關閉文件。確保沒有程序正在訪問您的文件。那麼你不會遇到這個錯誤。

如果您不確定任何程序是否可能正在訪問您的目錄,請確保在刪除目錄之前刪除(/關閉)目錄中的所有文件。

adb reboot是關閉打開的文件的一個選項。但這不是一個好的選擇。

6

此問題可能是導致通過

  • 兩個或多個進程引用相同的文件

  • 文件已被刪除,但參考不被殺死

然而,刪除它,只有一個參考被殺害,或者一個或多個過程中參考這個文件還

,你可以一步一步:

刪除您應該將文件

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

的文件之前,你已經打開,以及哪個進程引用您打開的文件。 也,此命令,我們展示的進程id

比,

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

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

好運!

0

我知道這是一個老問題,最初報告特定於XOOM,但是如果OP有一個打開的FileOutputStream沒有正確關閉,即通過Finally塊,那麼這可能是什麼導致了稍後嘗試引用它時要保留的資源......即使物理文件被實際刪除。

0

消息rm: could not remove directory (code EBUSY)表示某個應用程序或進程正在使用該目錄。

對我來說,這通常意味着AndroidStudio,Webstorm或其他IDE已打開。如果您打開了一個IDE,關閉它可以釋放該進程以刪除該文件夾。關閉後,再次運行刪除。

相關問題