SD kartta otomatik olarak dizin nasıl oluşturulur


189

Aşağıdaki konuma dosyamı kaydetmeye çalışıyorum
FileOutputStream fos = new FileOutputStream("/sdcard/Wallpaper/"+fileName); ama istisna alıyorum java.io.FileNotFoundException
Ancak, ne zaman "/sdcard/"çalışır gibi yol koymak .

Şimdi bu şekilde otomatik olarak dizin oluşturamadığımı varsayıyorum.

Birisi nasıl bir directory and sub-directorykod kullanarak oluşturmayı önerebilir ?

Yanıtlar:


449

En üst düzey dizini saran bir File nesnesi oluşturursanız , gerekli tüm dizinleri oluşturmak için mkdirs () yöntemini çağırabilirsiniz . Gibi bir şey:

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

Not: "SD Kart" dizinini almak için Environment.getExternalStorageDirectory () yöntemini kullanmak akıllıca olabilir, çünkü bir SD Kart dışında bir şey (dahili flaş, a'la iPhone). Her iki durumda da, SD Kart çıkartılabileceğinden, gerçekten orada olduğundan emin olmak için kontrol etmeniz gerektiğini unutmayın.

GÜNCELLEME: API Seviye 4 (1.6) 'dan bu yana da izin istemeniz gerekir. Böyle bir şey (manifestte) çalışmalıdır:

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

1
evet, daha sonra piyasaya sürülen Samsung tabletleri dahili flaş kullanıyor
CQM

2
AndroidManifest.xml
dosyasına

1
/Sdcard/com.my.code/data gibi bir alt alt klasörüm varsa, bu işe yaramıyor dikişler? Bunu nasıl çözebilirim?
Lony

Bu dizini de oluşturmanın yanı sıra? Unix mkdir'de 'force' gibi bir komut var mı?
lony

4
KitKat, harici, fiziksel sdcard üzerinde çalışmaz.
celoftis

57

Aynı sorun vardı ve sadece AndroidManifest.xml'in de bu izne ihtiyacı olduğunu eklemek istiyorum:

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

39

İşte benim için işe yarayan.

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

manifestinizde ve aşağıdaki kodda

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

yol, oluşturmak istediğiniz klasörün adıdır. MusicDownload gibi bir yol gönderdiyseniz .. Otomatik olarak / sdcard / MusicDownload olur. Shajeel Afzal
shehzy

İstisna atıyor java.io.IOException: açık başarısız: ENOENT (Böyle bir dosya veya dizin yok)
Anand Savjani

24

Aslında @fiXedd asnwer parçası kullandım ve benim için çalıştı:

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

Tam yolu oluşturmak için mkdir () değil mkdirs () kullandığınızdan emin olun.


@Fixedd cevabının bu kısmı nasıl? Cevabı kullanmaktı File.mkdirs(). Daha sonra bunu kullanmanın bir örneğini gösterdi.
Doomsknight

Aslında farkın ne olduğunu hatırlayamıyorum ama bazı düzenlemeler olduğunu düşünüyorum ... Bu arada, cevabı almak için cevabını kullandığımdan bahsetmiştim
Amt87

12

API 8 ve üstü ile SD kartın yeri değişti. @ fiXedd'in yanıtı iyidir, ancak daha güvenli kod Environment.getExternalStorageState()için medyanın kullanılabilir olup olmadığını kontrol etmek için kullanmalısınız . Ardından getExternalFilesDir(), istediğiniz dizine gitmek için kullanabilirsiniz (API 8 veya üstünü kullandığınızı varsayarak).

SDK belgelerinde daha fazla bilgi bulabilirsiniz .


8

Harici depolama biriminin bulunduğundan emin olun: 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

Dosya / klasör adlarınızda özel karakter bulunmadığından emin olun. Değişken (ler) kullanarak klasör adları ayarlarken ":" ile bana oldu

dosya / klasör adlarında izin verilmeyen karakterler

"* /: <>? \ |

U bu gibi durumlarda bu kodu yararlı bulabilir.

Aşağıdaki kod tüm ":" öğelerini kaldırır ve "-" ile değiştirir

//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 ben de denedim: ve hata var ve sonunda bu sorunu bulundu ve kaldırıldı: ve diğer tüm özel karakter.
Ganapathy C

6

Aynı sorunla karşılaştım. Android'de iki tür izin vardır:

  • Tehlikeli (kişilere erişim, harici depolama alanına yazma ...)
  • Normal (Normal izinler Android tarafından otomatik olarak onaylanırken, tehlikeli izinlerin Android kullanıcıları tarafından onaylanması gerekir.)

İşte Android 6.0'da tehlikeli izinler alma stratejisi

  • İznin verilip verilmediğini kontrol et
  • Uygulamanıza önceden izin verildiyse, devam edin ve normal şekilde gerçekleştirin.
  • Uygulamanızın henüz izni yoksa, kullanıcıdan onaylamasını isteyin
  • İçindeki kullanıcı onayını dinleyin onRequestPermissionsResult

Benim durumum: Harici depolama birimine yazmam gerekiyor.

İlk olarak, iznim olup olmadığını kontrol ediyorum:

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

Ardından kullanıcının onayını kontrol edin:

@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

Aynı sorunla karşılaştım, Galaxy S'de dizin oluşturamıyordum, ancak Nexus ve Samsung Droid'de başarıyla oluşturabiliyordum. Nasıl sabit aşağıdaki kod satırı ekleyerek oldu:

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

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

bu, sdcard'ınızda dor adında bir klasör oluşturur. sonra dor klasörüne manuel olarak eklenen egfilename.json dosyasını getirin . Sevmek:

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

<kullanım izinleri android: name = "android.permission.WRITE_EXTERNAL_STORAGE" />

ve manifest'e kod eklemeyi unutmayın


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

Vijay'ın gönderisini tamamlıyorum ...


Belirgin

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

fonksiyon

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

kullanım

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

Hataları kontrol edebilirsiniz

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

3

Bu, sdcard içinde sağladığınız Klasör adı ile klasör oluşturur.

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

1

Environment.getExternalStorageDirectory () yerine / sdcard / kullanabilirsiniz

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

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

4
Hayır, uygun API'yı çağırmak yerine sabit kodlanmış bir yol kullanmamalısınız. Bunu yapmak, belirli bir uygulamanın ayrıntılarına akılsız bir bağımlılık getirir.
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);

        }
    });`
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.