एसडी कार्ड पर स्वचालित रूप से निर्देशिका कैसे बनाएं


189

मैं अपनी फ़ाइल को निम्न स्थान
FileOutputStream fos = new FileOutputStream("/sdcard/Wallpaper/"+fileName); पर सहेजने की कोशिश कर रहा हूं, लेकिन मुझे अपवाद मिल java.io.FileNotFoundException
रहा है, हालांकि, जब मैं "/sdcard/"काम करता हूं, तो मैंने रास्ता डाल दिया ।

अब मैं मान रहा हूं कि मैं इस तरह से स्वचालित रूप से निर्देशिका बनाने में सक्षम नहीं हूं।

क्या कोई सुझाव दे सकता है कि एक directory and sub-directoryप्रयोग कोड कैसे बनाया जाए ?

जवाबों:


449

यदि आप एक फ़ाइल ऑब्जेक्ट बनाते हैं जो शीर्ष-स्तरीय निर्देशिका को लपेटता है तो आप इसे सभी आवश्यक निर्देशिकाओं को बनाने के लिए mkdirs () विधि कह सकते हैं । कुछ इस तरह:

// create a File object for the parent directory
File wallpaperDirectory = new File("/sdcard/Wallpaper/");
// have the object build the directory structure, if needed.
wallpaperDirectory.mkdirs();
// create a File object for the output file
File outputFile = new File(wallpaperDirectory, filename);
// now attach the OutputStream to the file object, instead of a String representation
FileOutputStream fos = new FileOutputStream(outputFile);

ध्यान दें: "SD कार्ड" निर्देशिका प्राप्त करने के लिए Environment.getExternalStorageDirectory () का उपयोग करना बुद्धिमान हो सकता है क्योंकि यदि कोई फ़ोन SD कार्ड (जैसे अंतर्निहित फ़्लैश, a'la) के अलावा कुछ और आता है, तो यह बदल सकता है आई - फ़ोन)। किसी भी तरह से आपको यह ध्यान में रखना चाहिए कि आपको यह सुनिश्चित करने के लिए जांच करने की आवश्यकता है कि यह वास्तव में एसडी कार्ड हटाया जा सकता है।

अद्यतन: चूंकि एपीआई स्तर 4 (1.6) आपको अनुमति का अनुरोध भी करना होगा। कुछ इस तरह से (प्रकट में) काम करना चाहिए:

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

1
हाँ, बाद में रिलीज़ की गई सैमसंग टैबलेट्स में अंतर्निहित फ्लैश
CQM

2
AndroidManifest.xml में stackoverflow.com/a/4435708/579646
max4ever

1
यदि मेरे पास सब-सब फ़ोल्डर है, जैसे /sdcard/com.my.code/data है तो यह काम नहीं करता है? मैं इसे कैसे हल कर सकता हूं?
11'12

इस निर्देशिका को बनाने के अलावा? क्या यूनिक्स मकिदिर में 'बल' जैसी कोई आज्ञा है?
Lony

4
किटकैट, बाहरी, शारीरिक एसडीकार्ड पर काम नहीं करता है।
celoftis

57

एक ही समस्या थी और वह जोड़ना चाहता था कि AndroidManifest.xml को भी इस अनुमति की आवश्यकता है:

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

39

यहाँ मेरे लिए क्या काम करता है।

 uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" 

आपके मैनिफ़ेस्ट और नीचे दिए गए कोड में

public static boolean createDirIfNotExists(String path) {
    boolean ret = true;

    File file = new File(Environment.getExternalStorageDirectory(), path);
    if (!file.exists()) {
        if (!file.mkdirs()) {
            Log.e("TravellerLog :: ", "Problem creating Image folder");
            ret = false;
        }
    }
    return ret;
}

पथ उस फ़ोल्डर का नाम है जिसे आप बनाना चाहते हैं। यदि आपने MusicDownload की तरह पथ भेजा है .. तो यह स्वचालित रूप से / sdcard / MusicDownload हो जाता है। शजील अफ़ज़ल
शेहज़ी

यह अपवाद java.io.IOException को फेंकता है: खुला विफल: ENOENT (ऐसी कोई फ़ाइल या निर्देशिका नहीं)
आनंद सावजानी

24

वास्तव में मैंने @fiXedd asnwer का हिस्सा इस्तेमाल किया और यह मेरे लिए काम किया:

  //Create Folder
  File folder = new File(Environment.getExternalStorageDirectory().toString()+"/Aqeel/Images");
  folder.mkdirs();

  //Save the path as a string value
  String extStorageDirectory = folder.toString();

  //Create New file and name it Image2.PNG
  File file = new File(extStorageDirectory, "Image2.PNG");

सुनिश्चित करें कि आप पूर्ण पथ बनाने के लिए mkdirs () नहीं mkdir () का उपयोग कर रहे हैं


@Fixedd उत्तर का यह "भाग" कैसा है? उसका उत्तर उपयोग करना था File.mkdirs()। उन्होंने तब इसका उपयोग करने का एक उदाहरण दिखाया।
प्रातः

वास्तव में मुझे याद नहीं है कि क्या अंतर था, लेकिन मुझे लगता है कि कुछ संपादन थे ... जिस तरह से मैंने उल्लेख किया है कि मैंने उसका जवाब हल पाने के लिए इस्तेमाल किया था
Amt87

12

एपीआई 8 और अधिक से अधिक के साथ, एसडी कार्ड का स्थान बदल गया है। @ FiXedd का जवाब अच्छा है, लेकिन सुरक्षित कोड के लिए, आपको यह Environment.getExternalStorageState()जांचने के लिए उपयोग करना चाहिए कि क्या मीडिया उपलब्ध है। तब आप उपयोग कर सकते हैंgetExternalFilesDir() इच्छित निर्देशिका पर नेविगेट करने के लिए हैं (यह मानकर कि आप एपीआई 8 या अधिक का उपयोग कर रहे हैं)।

आप एसडीके प्रलेखन में अधिक पढ़ सकते हैं ।


8

सुनिश्चित करें कि बाहरी संग्रहण मौजूद है: http://developer.android.com/guide/topics/data/data-storage.html#filesExternal

private boolean isExternalStoragePresent() {

        boolean mExternalStorageAvailable = false;
        boolean mExternalStorageWriteable = false;
        String state = Environment.getExternalStorageState();

        if (Environment.MEDIA_MOUNTED.equals(state)) {
            // We can read and write the media
            mExternalStorageAvailable = mExternalStorageWriteable = true;
        } else if (Environment.MEDIA_MOUNTED_READ_ONLY.equals(state)) {
            // We can only read the media
            mExternalStorageAvailable = true;
            mExternalStorageWriteable = false;
        } else {
            // Something else is wrong. It may be one of many other states, but
            // all we need
            // to know is we can neither read nor write
            mExternalStorageAvailable = mExternalStorageWriteable = false;
        }
        if (!((mExternalStorageAvailable) && (mExternalStorageWriteable))) {
            Toast.makeText(context, "SD card not present", Toast.LENGTH_LONG)
                    .show();

        }
        return (mExternalStorageAvailable) && (mExternalStorageWriteable);
    }

6

यह सुनिश्चित करने के लिए मत भूलें कि आपकी फ़ाइल / फ़ोल्डर नामों में कोई विशेष वर्ण नहीं है। मेरे साथ ":" हुआ, जब मैं फ़ोल्डर नाम चर (ओं) का उपयोग कर सेट कर रहा था

फ़ाइल / फ़ोल्डर नामों में वर्णों की अनुमति नहीं है

"* /: <>? | |

U ऐसे मामले में मददगार हो सकता है।

नीचे दिया गया कोड सभी ":" को हटा देता है और उन्हें "-" से बदल देता है

//actualFileName = "qwerty:asdfg:zxcvb" say...

    String[] tempFileNames;
    String tempFileName ="";
    String delimiter = ":";
    tempFileNames = actualFileName.split(delimiter);
    tempFileName = tempFileNames[0];
    for (int j = 1; j < tempFileNames.length; j++){
        tempFileName = tempFileName+" - "+tempFileNames[j];
    }
    File file = new File(Environment.getExternalStorageDirectory(), "/MyApp/"+ tempFileName+ "/");
    if (!file.exists()) {
        if (!file.mkdirs()) {
        Log.e("TravellerLog :: ", "Problem creating Image folder");
        }
    }

+1 या मैंने भी इसके साथ प्रयास किया: और त्रुटि मिली और अंत में उस मुद्दे को ढूंढ लिया गया और हटा दिया गया: और अन्य सभी विशेष वर्ण।
गणपति सी

6

मैंने उसी समस्या का सामना किया। Android में दो प्रकार की अनुमतियाँ हैं:

  • खतरनाक (संपर्कों तक पहुंच, बाहरी संग्रहण पर लिखें ...)
  • सामान्य (सामान्य अनुमतियां स्वचालित रूप से Android द्वारा अनुमोदित की जाती हैं, जबकि खतरनाक अनुमतियों को Android उपयोगकर्ताओं द्वारा अनुमोदित करने की आवश्यकता होती है।)

यहां Android 6.0 में खतरनाक अनुमति प्राप्त करने की रणनीति है

  • जाँच करें कि क्या आपके पास अनुमति है
  • यदि आपके ऐप को पहले से ही अनुमति दी गई है, तो आगे बढ़ें और सामान्य रूप से प्रदर्शन करें।
  • यदि आपके ऐप की अभी अनुमति नहीं है, तो उपयोगकर्ता से अनुमोदन करने के लिए कहें
  • में उपयोगकर्ता अनुमोदन को सुनें onRequestPermissionsResult

यहाँ मेरा मामला है: मुझे बाहरी संग्रहण पर लिखना होगा।

सबसे पहले, मैं जाँच करता हूँ कि क्या मेरी अनुमति है:

...
private static final int REQUEST_WRITE_STORAGE = 112;
...
boolean hasPermission = (ContextCompat.checkSelfPermission(activity,
            Manifest.permission.WRITE_EXTERNAL_STORAGE) == PackageManager.PERMISSION_GRANTED);
if (!hasPermission) {
    ActivityCompat.requestPermissions(parentActivity,
                new String[]{Manifest.permission.WRITE_EXTERNAL_STORAGE},
                REQUEST_WRITE_STORAGE);
}

फिर उपयोगकर्ता की स्वीकृति देखें:

@Override
public void onRequestPermissionsResult(int requestCode, String[] permissions, int[] grantResults) {
    super.onRequestPermissionsResult(requestCode, permissions, grantResults);
    switch (requestCode)
    {
        case REQUEST_WRITE_STORAGE: {
            if (grantResults.length > 0 && grantResults[0] == PackageManager.PERMISSION_GRANTED)
            {
                //reload my activity with permission granted or use the features what required the permission
            } else
            {
                Toast.makeText(parentActivity, "The app was not allowed to write to your storage. Hence, it cannot function properly. Please consider granting it this permission", Toast.LENGTH_LONG).show();
            }
        }
    }    
}

5

मैं एक ही समस्या का सामना कर रहा था, गैलेक्सी एस पर निर्देशिका बनाने में असमर्थ था, लेकिन इसे सफलतापूर्वक नेक्सस और सैमसंग ड्रॉयड पर बनाने में सक्षम था। निम्नलिखित कोड को जोड़कर मैंने यह कैसे तय किया:

File dir = new File(Environment.getExternalStorageDirectory().getPath()+"/"+getPackageName()+"/");
dir.mkdirs();

5
File sdcard = Environment.getExternalStorageDirectory();
File f=new File(sdcard+"/dor");
f.mkdir();

इससे आपके sdcard में dor नाम का फोल्डर बन जाएगा। फिर फ़ाइल के लिए फ़ाइल लाने के लिए जैसे- filename.json जो मैन्युअल रूप से dor फ़ोल्डर में डाला जाता है । पसंद:

 File file1 = new File(sdcard,"/dor/fitness.json");
 .......
 .....

<उपयोग-अनुमति android: नाम = "android.permission.WRITE_EXTERNAL_STORAGE" />

और मैनिफ़ेस्ट में कोड जोड़ना न भूलें


4
     //Create File object for Parent Directory
File wallpaperDir = new File(Environment.getExternalStorageDirectory().getAbsoluteFile() +File.separator + "wallpaper");
if (!wallpaperDir.exists()) {
wallpaperDir.mkdir();
}


File out = new File(wallpaperDir, wallpaperfile);
FileOutputStream outputStream = new FileOutputStream(out);

3

बस विजय का पद पूरा कर रहे हैं ...


प्रकट

uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"

समारोह

public static boolean createDirIfNotExists(String path) {
    boolean ret = true;

    File file = new File(Environment.getExternalStorageDirectory(), path);
    if (!file.exists()) {
        if (!file.mkdirs()) {
            Log.e("TravellerLog :: ", "Problem creating Image folder");
            ret = false;
        }
    }
    return ret;
}

प्रयोग

createDirIfNotExists("mydir/"); //Create a directory sdcard/mydir
createDirIfNotExists("mydir/myfile") //Create a directory and a file in sdcard/mydir/myfile.txt

आप त्रुटियों की जाँच कर सकते हैं

if(createDirIfNotExists("mydir/")){
     //Directory Created Success
}
else{
    //Error
}

3

यह आपके द्वारा प्रदत्त फ़ोल्डर नाम के साथ sdcard में फ़ोल्डर बना देगा।

File file = new File(Environment.getExternalStorageDirectory().getAbsolutePath() + "/Folder name");
        if (!file.exists()) {
            file.mkdirs();
        }

1

आप पर्यावरण के बजाय / sdcard / का उपयोग कर सकते हैं।

private static String DB_PATH = "/sdcard/Android/data/com.myawesomeapp.app/";

File dbdir = new File(DB_PATH);
dbdir.mkdirs();

4
नहीं, आपको उचित API को कॉल करने के बजाय एक कठिन कोडित पथ का उपयोग नहीं करना चाहिए। ऐसा करने से किसी विशेष कार्यान्वयन के विवरणों पर अविवेकी निर्भरता का परिचय मिलता है।
क्रिस स्ट्रैटन

1
ivmage.setOnClickListener(new View.OnClickListener() {

        @Override
        public void onClick(View v) {
            // TODO Auto-generated method stub
            Intent i = new Intent(
                    Intent.ACTION_PICK,
                    android.provider.MediaStore.Images.Media.EXTERNAL_CONTENT_URI);

            startActivityForResult(i, RESULT_LOAD_IMAGE_ADD);

        }
    });`
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.