Cara membuat direktori secara otomatis pada kartu SD

189

Saya mencoba untuk menyimpan file saya ke lokasi berikut
FileOutputStream fos = new FileOutputStream("/sdcard/Wallpaper/"+fileName); tetapi saya mendapatkan pengecualian java.io.FileNotFoundException
Namun, ketika saya meletakkan path saat "/sdcard/"ia bekerja.

Sekarang saya berasumsi bahwa saya tidak dapat membuat direktori secara otomatis dengan cara ini.

Dapatkah seseorang menyarankan cara membuat directory and sub-directorykode menggunakan?

Kshitij Aggarwal
sumber

Jawaban:

449

Jika Anda membuat objek File yang membungkus direktori tingkat atas, Anda dapat memanggilnya metode mkdirs () untuk membangun semua direktori yang diperlukan. Sesuatu seperti:

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

Catatan: Mungkin bijaksana untuk menggunakan Environment.getExternalStorageDirectory () untuk mendapatkan direktori "Kartu SD" karena ini dapat berubah jika ada telepon yang memiliki sesuatu selain Kartu SD (seperti flash yang terpasang di dalam, seperti iPhone). Bagaimanapun Anda harus ingat bahwa Anda perlu memeriksa untuk memastikan itu benar-benar ada karena Kartu SD dapat dihapus.

UPDATE: Sejak API Level 4 (1.6) Anda juga harus meminta izin. Sesuatu seperti ini (dalam manifes) harus berfungsi:

<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
Jeremy Logan
sumber
1
ya, tablet Samsung yang dirilis kemudian menggunakan built-in flash
CQM
2
jangan lupa untuk menambahkan ke AndroidManifest.xml hak untuk menulis stackoverflow.com/a/4435708/579646
max4ever
1
Kelihatannya ini tidak berfungsi jika saya memiliki sub-sub folder, seperti /sdcard/com.my.code/data? Bagaimana saya bisa menyelesaikan ini?
lony
Selain membuat direktori ini juga? Apakah ada perintah seperti 'force' di unix mkdir?
lony
4
Tidak berfungsi pada KitKat, eksternal, fisik sdcard.
celoftis
57

Mengalami masalah yang sama dan hanya ingin menambahkan bahwa AndroidManifest.xml juga memerlukan izin ini:

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

Inilah yang bekerja untuk saya.

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

dalam manifes Anda dan kode di bawah ini

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;
}
Vijay Kumar AB
sumber
path adalah nama folder yang ingin Anda buat. Jika Anda mengirim path seperti MusicDownload .. Secara otomatis menjadi / sdcard / MusicDownload. Shajeel Afzal
shehzy
Ini melempar pengecualian java.io.IOException: gagal terbuka: ENOENT (Tidak ada file atau direktori)
Anand Savjani
24

Sebenarnya saya menggunakan sebagian asnwer @fiXedd dan itu berhasil untuk saya:

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

Pastikan Anda menggunakan mkdir () bukan mkdir () untuk membuat jalur lengkap

Amt87
sumber
Bagaimana "bagian" dari jawaban @fixedd ini? Jawabannya adalah menggunakan File.mkdirs(). Dia kemudian menunjukkan contoh menggunakannya.
Doomsknight
Sebenarnya saya tidak ingat apa bedanya tapi saya pikir ada beberapa pengeditan ... Ngomong-ngomong saya menyebutkan bahwa saya menggunakan jawabannya untuk mendapatkan solusinya
Amt87
12

Dengan API 8 dan lebih besar, lokasi kartu SD telah berubah. @ fiXedd jawaban baik, tetapi untuk kode yang lebih aman, Anda harus menggunakan Environment.getExternalStorageState()untuk memeriksa apakah media tersedia. Maka Anda bisa menggunakannyagetExternalFilesDir() untuk menavigasi ke direktori yang Anda inginkan (dengan asumsi Anda menggunakan API 8 atau lebih besar).

Anda dapat membaca lebih lanjut di dokumentasi SDK .

Nick Ruiz
sumber
8

Pastikan penyimpanan eksternal ada: 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);
    }
Parth mehta
sumber
6

Jangan lupa untuk memastikan bahwa Anda tidak memiliki karakter khusus dalam nama file / folder Anda. Terjadi pada saya dengan ":" ketika saya mengatur nama folder menggunakan variabel

tidak diperbolehkan karakter dalam nama file / folder

"* /: <>? \ |

Anda mungkin menemukan kode ini membantu dalam kasus seperti itu.

Kode di bawah ini menghapus semua ":" dan menggantinya dengan "-"

//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");
        }
    }
Praveen
sumber
+1 ya saya juga mencoba: dan mendapat kesalahan dan akhirnya menemukan masalah itu dan menghapus: dan semua karakter khusus lainnya.
Ganapathy C
6

Saya menghadapi masalah yang sama. Ada dua jenis izin di Android:

  • Berbahaya (akses ke kontak, tulis ke penyimpanan eksternal ...)
  • Normal (Izin normal secara otomatis disetujui oleh Android, sementara izin berbahaya harus disetujui oleh pengguna Android.)

Berikut adalah strategi untuk mendapatkan izin berbahaya di Android 6.0

  • Periksa apakah Anda memiliki izin yang diberikan
  • Jika aplikasi Anda sudah diberi izin, silakan dan lakukan secara normal.
  • Jika aplikasi Anda belum memiliki izin, mintalah pengguna untuk menyetujui
  • Dengarkan persetujuan pengguna di onRequestPermissionsResult

Inilah kasus saya: Saya perlu menulis ke penyimpanan eksternal.

Pertama, saya memeriksa apakah saya memiliki izin:

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

Kemudian periksa persetujuan pengguna:

@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();
            }
        }
    }    
}
Syed Abdul Basit
sumber
5

Saya menghadapi masalah yang sama, tidak dapat membuat direktori pada Galaxy S tetapi berhasil membuatnya pada Nexus dan Samsung Droid. Cara saya memperbaikinya dengan menambahkan baris kode berikut:

File dir = new File(Environment.getExternalStorageDirectory().getPath()+"/"+getPackageName()+"/");
dir.mkdirs();
Garima Srivastava
sumber
5
File sdcard = Environment.getExternalStorageDirectory();
File f=new File(sdcard+"/dor");
f.mkdir();

ini akan membuat folder bernama dor di sdcard Anda. kemudian untuk mengambil file untuk eg- filename.json yang dimasukkan secara manual ke folder dor . Suka:

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

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

dan jangan lupa untuk menambahkan kode dalam manifes

jayant singh
sumber
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);
vikseln
sumber
3

Hanya menyelesaikan pos Vijay ...


Nyata

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

Fungsi

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

Pemakaian

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

Anda dapat memeriksa kesalahan

if(createDirIfNotExists("mydir/")){
     //Directory Created Success
}
else{
    //Error
}
Ismael Di Vita
sumber
3

Ini akan membuat folder dalam sdcard dengan nama Folder yang Anda berikan.

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

Anda dapat menggunakan / sdcard / bukannya Environment.getExternalStorageDirectory ()

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

File dbdir = new File(DB_PATH);
dbdir.mkdirs();
Peter Drinnan
sumber
4
Tidak, Anda tidak boleh menggunakan jalur kode keras alih-alih memanggil API yang tepat. Melakukan hal itu menimbulkan ketergantungan yang tidak bijaksana pada detail implementasi tertentu.
Chris Stratton
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);

        }
    });`
Wisnu Namboodiri
sumber