web-dev-qa-db-fra.com

Comment créer automatiquement un répertoire sur la carte SD

J'essaie de sauvegarder mon fichier à l'emplacement suivant
FileOutputStream fos = new FileOutputStream("/sdcard/Wallpaper/"+fileName); mais je reçois l'exception Java.io.FileNotFoundException
Cependant, quand je mets le chemin comme "/sdcard/" cela fonctionne.

Maintenant, je suppose que je ne peux pas créer de répertoire automatiquement de cette façon.

Quelqu'un peut-il suggérer comment créer un directory and sub-directory en utilisant un code?

184
Kshitij Aggarwal

Si vous créez un objet File qui enveloppe le répertoire de niveau supérieur, vous pouvez appeler sa méthode mkdirs () pour créer tous les répertoires nécessaires. Quelque chose comme:

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

Remarque: Il peut être judicieux d'utiliser Environment.getExternalStorageDirectory () pour obtenir le répertoire "SD Card" car cela pourrait changer. si un téléphone contenant autre chose qu'une carte SD arrive (par exemple un flash intégré, un iPhone). Quoi qu'il en soit, gardez à l'esprit que vous devez vérifier que la carte SD est bien présente, car elle risque d'être retirée.

UPDATE: Depuis le niveau 4 de l'API (1.6), vous devez également demander l'autorisation. Quelque chose comme ceci (dans le manifeste) devrait fonctionner:

<uses-permission Android:name="Android.permission.WRITE_EXTERNAL_STORAGE" />
442
Jeremy Logan

Avait le même problème et je veux juste ajouter que AndroidManifest.xml a également besoin de cette autorisation:

<uses-permission Android:name="Android.permission.WRITE_EXTERNAL_STORAGE" />
57
Daniel

Voici ce qui fonctionne pour moi.

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

dans votre manifeste et le code ci-dessous

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;
}
39
Vijay Kumar A B

En fait, j'ai utilisé une partie de @fiXedd answer et cela a fonctionné pour moi:

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

Assurez-vous que vous utilisez mkdirs () et non mkdir () pour créer le chemin complet.

24
Amt87

À partir de l’API 8, l’emplacement de la carte SD a changé. La réponse de @ fiXedd est bonne, mais pour un code plus sûr, vous devez utiliser Environment.getExternalStorageState() pour vérifier si le support est disponible. Ensuite, vous pouvez utiliser getExternalFilesDir() pour accéder au répertoire souhaité (en supposant que vous utilisiez l'API 8 ou une version supérieure).

Vous pouvez en savoir plus dans le documentation du SDK .

12
Nick Ruiz

Assurez-vous que le stockage externe est présent: 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);
    }
8
Parth mehta

J'ai rencontré le même problème. Il existe deux types d'autorisations dans Android:

  • Dangerous (accès aux contacts, écriture sur un stockage externe ...)
  • Normal (Les autorisations normales sont automatiquement approuvées par Android, tandis que les autorisations dangereuses doivent être approuvées par les utilisateurs Android.)

Voici la stratégie pour obtenir des autorisations dangereuses dans Android 6.0

  • Vérifiez si vous avez l'autorisation accordée
  • Si l'autorisation est déjà accordée à votre application, continuez normalement.
  • Si votre application ne dispose pas encore de l'autorisation, demandez à l'utilisateur d'approuver
  • Écouter l'approbation de l'utilisateur dans onRequestPermissionsResult

Voici mon cas: j'ai besoin d'écrire sur un stockage externe.

Tout d'abord, je vérifie si j'ai l'autorisation:

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

Puis vérifiez l'approbation de l'utilisateur:

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

N'oubliez pas de vous assurer que vos noms de fichiers/dossiers ne contiennent aucun caractère spécial. M'est arrivé avec ":" lorsque je définissais les noms de dossiers à l'aide de variable (s)

caractères non autorisés dans les noms de fichiers/dossiers

"* /: <>?\|

Vous pouvez trouver ce code utile dans un tel cas.

Le code ci-dessous supprime tous les ":" et les remplace par "-"

//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");
        }
    }
6
Praveen
File sdcard = Environment.getExternalStorageDirectory();
File f=new File(sdcard+"/dor");
f.mkdir();

cela créera un dossier nommé dor dans votre carte SD. puis chercher le fichier, par exemple, nomfichier.json, qui est inséré manuellement dans le dossier dor. Comme:

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

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

et n'oubliez pas d'ajouter du code dans manifest

5
jayant singh

Je faisais face au même problème, incapable de créer un répertoire sur Galaxy S mais j'ai réussi à le créer avec Nexus et Samsung Droid. Comment j'ai résolu le problème en ajoutant la ligne de code suivante:

File dir = new File(Environment.getExternalStorageDirectory().getPath()+"/"+getPackageName()+"/");
dir.mkdirs();
5
Garima Srivastava
     //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);
4
vikseln

Je viens de terminer le post de Vijay ...


manifeste

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

Fonction

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

tilisation

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

Vous pouvez vérifier les erreurs

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

Cela créera un dossier dans sdcard avec le nom de dossier que vous fournissez.

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

Vous pouvez utiliser/sdcard/à la place de Environment.getExternalStorageDirectory ()

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

File dbdir = new File(DB_PATH);
dbdir.mkdirs();
1
Peter Drinnan
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);

        }
    });`
1
Vishnu Namboodiri