2010-12-28 21 views
11

में काम नहीं कर मैं बाहर अब थोड़ी देर के लिए इस पर मेरे बाल खींच रहा है। निम्न विधि को फ़ाइल डाउनलोड करना है, और हार्ड ड्राइव पर निर्दिष्ट स्थान पर सहेजना है।फ़ाइल mkdirs() विधि एंड्रॉयड/जावा

private static void saveImage(Context context, boolean backgroundUpdate, URL url, File file) { 

    if (!Tools.checkNetworkState(context, backgroundUpdate)) 
     return; 

    // Get the image 
    try { 
     // Make the file 
     file.getParentFile().mkdirs(); 

     // Set up the connection 
     URLConnection uCon = url.openConnection(); 
     InputStream is = uCon.getInputStream(); 
     BufferedInputStream bis = new BufferedInputStream(is); 

     // Download the data 
     ByteArrayBuffer baf = new ByteArrayBuffer(50); 
     int current = 0; 
     while ((current = bis.read()) != -1) { 
       baf.append((byte) current); 
     } 

     // Write the bits to the file 
     OutputStream os = new FileOutputStream(file); 
     os.write(baf.toByteArray()); 
     os.close(); 
    } catch (Exception e) { 
     // Any exception is probably a newtork faiilure, bail 
     return; 
    } 
} 

इसके अलावा, यदि फ़ाइल मौजूद नहीं है, तो यह फ़ाइल के लिए निर्देशिका बनाना है। (और यदि उस स्थान पर पहले से ही एक और फाइल है, तो इसे कुछ भी नहीं करना चाहिए)। हालांकि, किसी कारण से, mkdirs() विधि निर्देशिका को कभी नहीं बनाता है। मैंने स्पष्ट रूप से मूल फ़ाइल वर्ग बनाने के लिए स्पष्ट ब्रांड्स से सब कुछ करने की कोशिश की है, और कुछ भी काम नहीं करता है। मैं काफी हद तक निश्चित हूं कि ड्राइव लिखने योग्य है, क्योंकि इसे केवल बाद में ही निर्धारित किया जा चुका है, यह भी डिबगिंग के दौरान इसे चलाने के बाद सच है। तो विधि विफल हो जाती है क्योंकि मूल निर्देशिका नहीं बनाई जाती है। क्या कोई मुझे बता सकता है कि जिस तरह से मैं इसे बुला रहा हूं उससे कुछ गलत है?

https://github.com/LeifAndersen/NetCatch/blob/master/src/net/leifandersen/mobile/android/netcatch/services/RSSService.java

धन्यवाद

उत्तर

30

आप अपने एसडी कार्ड के लिए सामग्री लिख रहे हैं, तो आप में android.permission.WRITE_EXTERNAL_STORAGE अनुमति जोड़ लिया है उम्मीद अपने प्रकट

+0

मैं विश्वास नहीं कर सकता, यह काम किया। मैं अब बेवकूफ की तरह महसूस करता हूँ। दूसरी तरफ, यह प्रोजेक्ट के अन्य अन्य संशोधनों में जादुई रूप से काम कर रहा था, अजीब। आपका बहुत धन्यवाद। –

3

आप यह सुनिश्चित करें कि mkdirs विफल हो रहा है कर रहे हैं:

इसके अलावा, अगर यह मदद करता है, यहाँ फ़ाइल मैं में यह फोन कर रहा हूँ के लिए स्रोत है? आप mkdirs कॉल के वापसी मूल्य की जांच क्यों नहीं करते हैं और यदि यह झूठी वापसी करता है तो एक त्रुटि संदेश लॉग इन करें?

if (!file.getParentFile().exists() && !file.getParentFile().mkdirs()){ 
    log("Unable to create " + file.getParentFile()); 
} 

मुझे लगता है कि आप के साथ क्या फ़ाइल था ...

पुनश्च हैरानी हो सकती है - और कि त्रुटि हैंडलर के साथ कुछ करने के लिए कृपया - कम से कम, त्रुटि लॉग इन करें। अपवाद पकड़ना और एक मूक वापसी करना भयानक अभ्यास है।

+0

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

13

कृपया इस के साथ जांच, तो यह आपको मदद मिल सकती है ..

<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" /> 

अपने मेनिफ़ेस्ट में Tis अनुमति दर्ज फ़ाइल।

+0

यूप, यही वह है। –

5

Kevin Day के उत्तर के आगे एक अन्य विफलता मोडलिटी है कि पिछली पोस्टों का उल्लेख नहीं किया गया था। यह है कि अगर आपके पास android.permission.WRITE_EXTERNAL_STORAGE आपके मैनिफेस्ट में है, तो यदि आप /mnt/sdcard जैसे मीडिया पर लिखने की कोशिश कर रहे हैं जो यूएसबी गैजेट के रूप में बाहरी रूप से घुड़सवार है (यानी आपने यूएसबी केबल के साथ अपने पीसी पर बाहरी डिस्क के रूप में अपना डिवाइस कनेक्ट किया है) जिस समय आप लिखने की कोशिश कर रहे हैं, तब आप/mnt/sdcard फ़ाइल सिस्टम पर नहीं लिख सकते हैं। इस मामले में FILE.mkdir झूठी वापसी करेगा। जाहिर है, अगर आप रिटर्न कोड की जांच नहीं कर रहे हैं तो आप इस समस्या को तब तक नहीं देख पाएंगे जब तक आप IOException प्राप्त नहीं करते हैं, यदि आप उस निर्देशिका में फ़ाइल बनाने का प्रयास करते हैं जो आपको लगता है कि आपने बनाया है। और यदि आप इस गैर-मौजूद निर्देशिका में कोई फ़ाइल नहीं बनाते हैं तो ऐप चुपचाप विफल हो जाएगा।

एंड्रॉइड ऐप्स डिबग करते समय मैं यह गलती लगातार बना देता हूं - भूल जाओ कि मैं दोनों को एसडीकार्ड बाहरी रूप से घुमाया नहीं जा सकता है और साथ ही साथ मेरा ऐप लिख सकता है।

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