2010-08-28 15 views
26

मेरे ऐप में संपत्ति फ़ोल्डर में उपनिर्देशिका में .txt फ़ाइलें हैं। यह उन .txt फ़ाइलों को पढ़ता है और उन्हें एक टेक्स्टव्यू में रखता है। यह बहुत अच्छा काम कर रहा है और कोई समस्या नहीं है।एंड्रॉइड संपत्ति फ़ोल्डर में फ़ाइल अस्तित्व की जांच करें?

मैं के बारे में संपत्ति में फ़ाइलों को उपयोगकर्ता या लापता द्वारा नष्ट कर दिया हो रही फ़ोल्डर में चिंतित होना चाहिए। यदि यह कभी भी हो सकता है, तो मेरे ऐप को एक त्रुटि मिलेगी क्योंकि फ़ाइल स्ट्रीम में पढ़ने की कोशिश करते समय फ़ाइल नहीं होगी।

वहाँ से पहले मैंने इसे पढ़ा या संपत्ति प्रबंधक यह सब की देखभाल करता है एक परिसंपत्ति फ़ाइल के अस्तित्व की जाँच करने के लिए मेरे लिए एक की जरूरत है? मैं यह भी सोच रहा था कि क्या कोई मौका है कि उपयोगकर्ता हटाएगा और संपत्ति फाइल कर सकता है या नहीं।

जैसा मैं कहता हूँ, सब कुछ बिना मुझे फ़ाइल होने की जाँच करने के लिए कोड डालने ठीक काम करता है। मैंने सोचा कि क्या लोग संपत्तियों से स्ट्रीम में पढ़ने के लिए हर बार .exists() कथन का उपयोग करते हैं।

उत्तर

4

हाँ और नहीं।

एक सामान्य उपयोगकर्ता उन्हें नष्ट करने में सक्षम नहीं होगा, लेकिन एक निहित फोन पर एक उपयोगकर्ता के लिए जो वे क्या कर रहे पता नहीं है ... कि एक अलग स्थिति है।

यदि आप मुझसे पूछते हैं, तो अतिरिक्त कोड की आवश्यकता नहीं है। अगर आप किसी फ़ाइल को खोलने और खोलने की कोशिश नहीं करते हैं, तो आपको किसी बिंदु पर एक अपवाद फेंक दिया जाएगा, उसे पकड़ लें और यदि आप वास्तव में चाहते हैं तो एक संवाद प्रदर्शित करें।

+0

महान: इस प्रकार कार्यावधि में वर्तमान बिल्ड apk,

में हम ऐसा! धन्यवाद क्रिस।मेरे पास कोड में 'कोशिश/पकड़' सौदा चल रहा है लेकिन मुझे आश्चर्य हुआ कि उपयोगकर्ता संपत्तियों तक पहुंचने में सक्षम है। अरे, कहने का प्रयास करें, "संपत्तियों तक पहुंचें" पांच गुना तेजी से। हा! – Allan

+1

उससे अधिक - उन्हें "हटाने" का एकमात्र तरीका उनके बिना .apk को पुनर्निर्माण करना है, जिसके लिए इसे एक अलग प्रमाणपत्र के साथ इस्तीफा देना आवश्यक है। यदि आप दुर्घटनाग्रस्त हैं क्योंकि किसी ने ऐसा किया है, तो वे इसके लायक से अधिक हैं। : पी – hackbod

1

मुझे लगता है कि आपको ठीक होना चाहिए। मेरे फोन में चारों ओर एक रूट होने से मैं ऐप को हटाए बिना assest को हटाने का कोई तरीका नहीं देख सकता क्योंकि यह सब .apk फ़ाइल में लपेटा हुआ प्रतीत होता है। आप कर सकते हैं लेकिन मुझे लगता है कि आपको रूट या एडब का उपयोग करने की आवश्यकता है।

मैं व्यक्तिगत रूप से किसी भी पढ़ने के चारों ओर हैं/एक कोशिश/ब्लॉक पकड़ वैसे भी साथ लेखन, सुरक्षा के लिए।

+0

बहुत अच्छा एस्पिन्डेव, आपके उत्तर के लिए बहुत बहुत धन्यवाद। – Allan

21

तुम सच में फ़ाइल होने की जाँच करना चाहते हैं:

AssetManager mg = getResources().getAssets(); 
InputStream is = null; 
try { 
    is = mg.open(pathInAssets); 
    //File exists so do something with it 
} catch (IOException ex) { 
    //file does not exist 
} finally { 
    if (is != null) { 
    is.close(); 
    } 
} 

अपनी फ़ाइल assets/folder/file.ext में स्थित है, तो pathInAssets "folder/file.ext"

+2

यदि यह विफल नहीं होता है तो आपको खुली स्ट्रीम बंद करनी चाहिए। – Moss

+0

ठीक है, इसे संदर्भ के रूप में सहेजा नहीं जा रहा है, इसलिए किसी भी तरह से –

57

आप चिंतित हो सकता है कि फ़ाइल हटा दिया गया है हो सकता है और apk इस्तीफा दे दिया

आप का उपयोग कर सकते हैं:

Arrays.asList(getResources().getAssets().list("")).contains("myFile") 
+1

विधि कॉल के अंत में लौटाया गया इनपुटस्ट्रीम साफ़ किया जाना चाहिए, जब आपके पास अनन्य फाइल नाम होते हैं, अन्यथा नाट्रोनाइट समाधान का उपयोग करते हैं। – IlyaEremin

+0

मैं एक सामान्य ऐप को टेम्पलेट के रूप में डिज़ाइन कर रहा हूं, जिसमें कुछ एम्बेडेड फ़ाइलें हो सकती हैं या नहीं। यह समाधान मेरे लिए बहुत अच्छा काम करता है, धन्यवाद! :) –

+0

@IlyaEremin गैर अद्वितीय फ़ाइल नाम। मैं उत्सुक हूं कि यह कैसे काम करता है। – njzk2

5

आदर्श रूप में के बाद apk बनाया गया है, कोई भी यह से किसी भी संपत्ति को हटा सकते हैं, लेकिन किसी को यह decompiled और recompiles की तुलना में यह संभव हो सकता है।

हालांकि अन्य परिदृश्यों एक परिसंपत्ति क्रम में apk में मौजूद नहीं है भी जब के लिए, हम संपत्ति के अस्तित्व की जाँच कर सकते हैं।

हमारे ऐप में, हमारे पास ग्रेबल, चींटी और ग्रहण का उपयोग करके ऐप बनाने का प्रावधान है, और प्रत्येक निर्माण तंत्र के लिए हमारी कुछ संपत्ति फाइल एपीके में बंडल की जाती है और कुछ नहीं हैं, इसलिए यह पहचानने के लिए कि कोई संपत्ति फ़ाइल मौजूद है या नहीं

private boolean isAssetExists(String pathInAssetsDir){ 
    AssetManager assetManager = AppContext.get().getResources().getAssets(); 
    InputStream inputStream = null; 
    try { 
     inputStream = assetManager.open(pathInAssetsDir); 
     if(null != inputStream) { 
      return true; 
     } 
    } catch(IOException e) { 
     e.printStackTrace(); 
    } finally { 
     try { 
      inputStream.close(); 
     } catch (IOException e) { 
      e.printStackTrace(); 
     } 
    } 
    return false; 
} 
संबंधित मुद्दे