কীভাবে এসডি কার্ডে স্বয়ংক্রিয়ভাবে ডিরেক্টরি তৈরি করবেন


189

আমি আমার ফাইলটি নিম্নলিখিত স্থানে সংরক্ষণের চেষ্টা করছি
FileOutputStream fos = new FileOutputStream("/sdcard/Wallpaper/"+fileName); তবে আমি ব্যতিক্রম পাচ্ছি java.io.FileNotFoundException
তবে যাইহোক, আমি যখন পথটি "/sdcard/"এটি কাজ করি তখনই রাখি ।

এখন আমি ধরে নিচ্ছি যে আমি এভাবে স্বয়ংক্রিয়ভাবে ডিরেক্টরি তৈরি করতে পারছি না।

কেউ কীভাবে একটি directory and sub-directoryইউজিং কোড তৈরি করবেন তা পরামর্শ দিতে পারেন ?

উত্তর:


449

আপনি যদি এমন কোনও ফাইল অবজেক্ট তৈরি করেন যা শীর্ষ স্তরের ডিরেক্টরিটি মোড় করে থাকে তবে প্রয়োজনীয় সমস্ত ডিরেক্টরি তৈরির জন্য আপনি একে এমকিডিয়ার্স () পদ্ধতি বলতে পারেন। কিছুটা এইরকম:

// 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);

দ্রষ্টব্য: "এসডি কার্ড" ডিরেক্টরি পাওয়ার জন্য পরিবেশ.গেটএক্সটার্নাল স্টোরেজ ডিরেক্টরি () ব্যবহার করা বুদ্ধিমানের কাজ হতে পারে কারণ এসডি কার্ড ব্যতীত অন্য কোনও কিছু যদি এমন কোনও ফোন আসে (যেমন বিল্ট-ইন ফ্ল্যাশ, আ'লা আইফোন)। যে কোনও উপায়ে আপনার মনে রাখা উচিত যে এসডি কার্ডটি মুছে ফেলা হতে পারে কারণ এটি অবশ্যই আছে তা নিশ্চিত করার জন্য আপনার পরীক্ষা করা দরকার।

আপডেট: এপিআই স্তর 4 (1.6) যেহেতু আপনাকেও অনুমতিটির জন্য অনুরোধ করতে হবে। এর মতো কিছু (ম্যানিফেস্টে) কাজ করা উচিত:

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

1
হ্যাঁ, পরবর্তীকালে প্রকাশিত স্যামসাং ট্যাবলেটগুলি বিল্ট-ইন ফ্ল্যাশ ব্যবহার করে
সিকিউএম

2
Andro আইডি লিখতে অধিকার যোগ করতে ভুলবেন না stackoverflow.com/a/4435708/579646
max4ever

1
যদি আমার কাছে সাব-সাব ফোল্ডার, /sdcard/com.my.code/data এর মতো থাকে তবে এটি কাজ করছে না? আমি কীভাবে এটি সমাধান করতে পারি?
একাকী

এই ডিরেক্টরি তৈরি ছাড়াও? ইউনিক্স এমকেডিরে 'ফোর্স' এর মতো কমান্ড আছে কি?
একাকী

4
বাহ্যিক, শারীরিক এসডকার্ড, কিটক্যাট এ কাজ করে না।
সেলফটিস

57

একই সমস্যা ছিল এবং কেবল যুক্ত করতে চান যে AndroidManLive.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;
}

পাথ হ'ল ফোল্ডারের নাম যা আপনি তৈরি করতে চান। আপনি যদি মিউজিকডাউনলোডের মতো পথ প্রেরণ করেন .. এটি স্বয়ংক্রিয়ভাবে / এসডিকার্ড / মিউজিকডাউনলোড হয়ে যায়। শজিল আফজাল
শেহজি

এটি 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 ()


@ ফিক্সড্ড উত্তরের এই "অংশ" কীভাবে? তাঁর উত্তরটি ব্যবহার করা ছিল File.mkdirs()। এরপরে তিনি এটি ব্যবহারের একটি উদাহরণ দেখিয়েছিলেন।
ডুমসকনাইট

আসলে আমি পার্থক্যটি কী তা মনে করতে পারি না তবে আমি মনে করি কিছু সম্পাদনা ছিল ... উপায় দ্বারা আমি উল্লেখ করেছি যে সমাধান পেতে আমি তার উত্তরটি ব্যবহার করেছি
Amt87

12

এপিআই 8 এবং আরও বেশি সহ, এসডি কার্ডের অবস্থান পরিবর্তন হয়েছে। @ ফিক্সএডডির উত্তর ভাল তবে নিরাপদ কোডের জন্য Environment.getExternalStorageState()আপনার মিডিয়া উপলব্ধ কিনা তা যাচাই করা উচিত । তারপরে আপনি ব্যবহার করতে পারেনgetExternalFilesDir() যে ডিরেক্টরিটি চান তা নেভিগেট করতে পারেন (ধরে নিবেন আপনি API 8 বা তার বেশি ব্যবহার করছেন)।

আপনি এসডিকে ডকুমেন্টেশনে আরও পড়তে পারেন ।


8

বাহ্যিক স্টোরেজ উপস্থিত রয়েছে তা নিশ্চিত করুন: http://developer.android.com/guide/topics/data/data-stores.html#files বহিরাগত

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

আপনার ফাইল / ফোল্ডারের নামগুলিতে আপনার কোনও বিশেষ অক্ষর নেই তা নিশ্চিত করতে ভুলবেন না। যখন আমি ভেরিয়েবল (গুলি) ব্যবহার করে ফোল্ডারের নামগুলি সেট করছিলাম তখন ":" দিয়ে আমার সাথে ঘটেছিল

ফাইল / ফোল্ডার নামগুলিতে অনুমোদিত অক্ষর নেই

"* /: <>? \ |

আপনি এই ক্ষেত্রে এই কোডটিকে সহায়ক বলে মনে করতে পারেন।

নীচের কোডটি সমস্ত ":" মুছে ফেলে এবং তাদের "-" দিয়ে প্রতিস্থাপন করে

//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

আমিও একই সমস্যার মুখোমুখি হয়েছি। অ্যান্ড্রয়েডে দুটি ধরণের অনুমতি রয়েছে:

  • বিপজ্জনক (পরিচিতিগুলিতে অ্যাক্সেস, বাহ্যিক স্টোরেজে লিখুন ...)
  • সাধারণ (সাধারণ অনুমতিগুলি অ্যান্ড্রয়েড দ্বারা স্বয়ংক্রিয়ভাবে অনুমোদিত হয় তবে বিপজ্জনক অনুমতিগুলি অ্যান্ড্রয়েড ব্যবহারকারীদের দ্বারা অনুমোদিত হওয়া প্রয়োজন))

অ্যান্ড্রয়েড .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();

এটি আপনার এসডিকার্ডে ডর নামের একটি ফোল্ডার তৈরি করবে। এরপরে ফাইল আনতে যেমন- filename.json যা ম্যানুয়ালি dor ফোল্ডারে .োকানো হয় । ভালো লেগেছে:

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

<ব্যবহার-অনুমতি অ্যান্ড্রয়েড: নাম = "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

এটি আপনার সরবরাহিত ফোল্ডারের নাম সহ এসডিকার্ডে ফোল্ডার তৈরি করবে।

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

1

আপনি পরিবেশের পরিবর্তে / এসডিকার্ড / ব্যবহার করতে পারেন।

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

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

4
না, আপনাকে যথাযথ এপিআই কল করার পরিবর্তে কোনও হার্ড কোডড পথ ব্যবহার করা উচিত নয়। এটি করার ফলে একটি নির্দিষ্ট বাস্তবায়নের বিশদগুলির উপর একটি অজ্ঞান নির্ভরতা প্রবর্তিত হয়।
ক্রিস স্ট্রাটন

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);

        }
    });`
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.