2012-07-18 15 views
34

मुझे अपने ऐप में एक अजीब त्रुटि है।खुला असफल: EBUSY (डिवाइस या संसाधन व्यस्त)

मेरे ऐप में यह एक zipfile डाउनलोड करने के लिए, यह क्या है के रूप में सामग्री पढ़ें और इसे हटा संभव है। इससे कोई फर्क नहीं पड़ता कि यह वास्तव में क्या है।

समस्या: केवल Motorola Xoom (संस्करण 4.0.4) पर मैं फ़ाइल डाउनलोड कर सकते हैं, इसे अनज़िप, मैं डेटा पढ़ सकते हैं और मैं सब कुछ नष्ट कर सकते हैं। लेकिन अगर मैं फ़ाइल को फिर से डाउनलोड करने का प्रयास करता हूं और जब यह फ़ाइल को अनजिप करता है और फ़ाइलों को एसडी-कार्ड में कॉपी करता है तो यह त्रुटि EBUSY (डिवाइस या संसाधन व्यस्त) के साथ क्रैश हो जाता है।

  1. यह केवल पहली बार क्यों काम कर रहा है?
  2. क्या त्रुटि है?
  3. मुझे यह त्रुटि केवल ज़ूम पर क्यों मिलती है?

मुझे लगता है कि किसी भी समस्या का समाधान नहीं मिल सकता है। अन्य सभी उपकरणों पर यह ठीक काम करता है, कोई त्रुटि या समस्या नहीं है।

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 (प्रवेश) ... और मैं वास्तव में जानते हो क्यों न?

क्या व्यस्त होने पर डिवाइस या सहारा का इंतजार करने का कोई तरीका है? यह हर बार होता है जब मैं फ़ाइल को अनजिप करने का प्रयास करता हूं, ऐप इसे 5 बार (डाउनलोड करना -> अनजिप) करने की कोशिश करता है और यह हर बार दुर्घटनाग्रस्त हो जाता है।

संपादित करें: हमने पाया, न केवल यह ज़ूम। हम यह भी संस्करण 4.0.4

+1

मुझे एक ही समस्या है। "रूट एक्सप्लोरर" ऐप खुला था। –

उत्तर

77

मैं बड़ा जवाब है साथ Asus Transformer साथ त्रुटि है !! समस्या एंड्रॉइड सिस्टम या/और FAT32 सिस्टम से आता है। मैं समझ नहीं सकता कि सिस्टम को त्रुटि कैसे मिलती है, इसमें फ़ाइलों और FAT32 सिस्टम को हटाने के साथ कुछ करना है।

लेकिन समाधान वास्तव में आसान है: इससे पहले कि आप एक निर्देशिका या फ़ाइल को हटा दें: इसका नाम बदलना!

कोड नाम बदलने के लिए:

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

Thats यह है, अगर आप फ़ोल्डर का नाम बदलने या हटाने से पहले इसके फ़ाइल, वहाँ कोई या मौका प्रणाली फिर से किसी मौजूदा फ़ाइल को खोलने का प्रयास करने के लिए के लिए एक खुली फ़ाइल जो है आप फिर से सहेजना चाहते हैं (या ऐसा कुछ)।

+1

getPath() के बजाय getAbsolutePath() का उपयोग करने का कोई कारण? –

+0

इस फ़ाइल के पूर्ण पथ का उपयोग करने के लिए कोई कारण नहीं है, मुझे लगता है कि getPath() का उपयोग करना भी संभव है। कोई वारंटी नहीं :) – Informatic0re

+0

@Mirko किसी अन्य ऐप के माध्यम से कुछ हटाए जाने पर कामकाज के किसी भी विचार? (यानी उपयोगकर्ता जो फ़ाइल प्रबंधक ऐप के माध्यम से अपने सिस्टम से फ़ाइलों को हटा रहे हैं) –

2

ऐसा लगता है कि यह एक लचीला फाइल सिस्टम लॉक है। मैंने इसे अपने कोड को छूए बिना तय किया, मुझे लगता है कि यह मेरे यूएसबी केबल को अनप्लग करके और इसे फिर से प्लग करने के द्वारा किया गया था।

+0

मैं त्रुटि नहीं था "यह befor इसे हटा नाम बदलने" नियम के बाद फिर से । इसलिए मैं आपके समाधान का परीक्षण नहीं कर सकता और मुझे यह भी यकीन नहीं है कि डिवाइस हमेशा यूएसबी के साथ प्लग किया गया था या नहीं। – Informatic0re

+0

नहीं। मेरे लिए काम नहीं किया – drulabs

+0

मुझे मदद की, एक ताला नहीं था, फिर से प्लग इन करके हल किया गया है, धन्यवाद – keybee

2

एक ही त्रुटि हो रही थी, अनप्लगिंग करने की कोशिश की, ग्रहण को पुनरारंभ करना आदि लेकिन कुछ भी काम नहीं कर रहा था। अंत में फोन को रिबूट करने के लिए किया था और सभी जगह में वापस गिर गया, मुझे सही मार्ग पर डालने के लिए)

धन्यवाद !!

0

मैं सोनी एक्सपीरिया में इस त्रुटि पर ध्यान जब निर्देशिका में फ़ाइल यह करने के लिए कुछ सामग्री लिख के बाद नहीं बंद कर दिया और मैं का उपयोग करने की कोशिश कर रहा हूँ (बदलें/हटाना) निर्देशिका।

फ़ाइल ठीक से बंद करने के लिए सुनिश्चित करें। सुनिश्चित करें कि कोई भी प्रोग्राम आपकी फ़ाइलों तक नहीं पहुंच रहा है। तो आप इस त्रुटि में नहीं आते हैं।

यदि आप अनिश्चित हैं कि किसी भी कार्यक्रम अपने निर्देशिका पर पहुँचने की जा सकती हैं, तो हटाना सुनिश्चित करें (/ बंद) निर्देशिका को हटाने से पहले निर्देशिका में सभी फ़ाइलों हो।

एडीबी रिबूट एक ही विकल्प खोला फ़ाइलों को बंद करने के लिए है। लेकिन ऐसा करने का यह अच्छा विकल्प नहीं है।

6

यह समस्या द्वारा

  • दो या अधिक प्रक्रिया को संदर्भित एक ही फाइल

  • फ़ाइल नष्ट कर दिया गया कारण हो सकता है, लेकिन संदर्भ मारा नहीं जा

हालांकि, इसे नष्ट कर दिया, केवल एक संदर्भ की मौत हो गई, या एक या अधिक प्रक्रिया संदर्भ इस फाइल भी

आप चरण दर चरण कर सकते हैं:

इससे पहले कि आप फ़ाइल आपको चाहिए

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

फ़ाइल को नष्ट आप खोल दिया गया है , और कौन सी प्रक्रिया आपके द्वारा खोला गया फ़ाइल संदर्भित करती है। भी इस आदेश, हमें प्रक्रिया आईडी

से

,

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

आश्चर्य आपका इंतजार कर दिखाने के लिए, ओ (∩_∩) हे

अच्छी किस्मत!

0

मैं समझता हूं कि यह एक पुराना मुद्दा है, और मूल रूप से एक्सओओएम के लिए विशिष्ट रूप से रिपोर्ट किया गया था, लेकिन यदि ओपी के पास एक खुला फ़ाइलऑटपुटस्ट्रीम था जो ठीक से बंद नहीं हुआ था, यानी अंततः ब्लॉक के माध्यम से, तो संभव है कि यह क्या हो रहा है संसाधन जब बाद में इसे संदर्भ के लिए प्रयास कर ... भले ही भौतिक फ़ाइल वास्तव में नष्ट कर दिया गया आयोजित किया जाएगा।

0

संदेश rm: could not remove directory (code EBUSY), इसका अर्थ है कि कुछ ऐप या प्रक्रिया निर्देशिका का उपयोग कर रही है।

मेरे लिए, आमतौर पर इसका मतलब है एंड्रॉइडस्टूडियो, वेबस्टॉर्म, या कोई अन्य आईडीई खुला है। यदि आपके पास एक आईडीई खुला है, तो इसे बंद करने से फ़ोल्डर को निकालने के लिए प्रक्रिया को मुक्त कर दिया जा सकता है। बंद करने के बाद, बस फिर से हटाने को चलाएं।

संबंधित मुद्दे