58 votes

La création d'un répertoire dans /sdcard échoue

J'ai essayé de créer un répertoire dans /sdcard de manière programmatique, mais cela ne fonctionne pas. Le code ci-dessous produit toujours directory not created.

boolean success = (new File("/sdcard/map")).mkdir(); 
if (!success) {
    Log.i("directory not created", "directory not created");
} else {
    Log.i("directory created", "directory created");
}

151voto

Gopinath Points 5997

Trois éléments sont à prendre en considération :

  1. Ne supposez pas que la carte SD est montée à l'emplacement /sdcard (Cela peut être vrai dans le cas par défaut, mais il vaut mieux ne pas le coder en dur). Vous pouvez obtenir l'emplacement de sdcard en interrogeant le système :

    Environment.getExternalStorageDirectory();
  2. Vous devez informer Android que votre application a besoin d'écrire sur le stockage externe en ajoutant une entrée uses-permission dans le fichier AndroidManifest.xml fichier :

    <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>
  3. Si ce répertoire existe déjà, mkdir renverra false. Vérifiez donc l'existence du répertoire, puis essayez de le créer s'il n'existe pas. Dans votre composant, utilisez quelque chose comme :

    File folder = new File(Environment.getExternalStorageDirectory() + "/map");
    boolean success = true;
    if (!folder.exists()) {
        success = folder.mkdir();
    }
    if (success) {
        // Do something on success
    } else {
        // Do something else on failure 
    }

7 votes

Avant Froyo, la carte SD était montée dans /sdcard. À partir de Froyo, la carte SD est montée sur /mnt/sdcard et un lien souple est créé vers /sdcard afin que les applications se comportent correctement malgré le changement de point de montage.

2 votes

Pour une raison ou une autre, ce code ne fonctionne pas sur mon téléphone myTouch...hmm le .mkdir() renvoie toujours false.

3 votes

Je pense que vous devriez vérifier les autorisations et que le disque n'est pas monté sur le système de fichiers du PC.

16voto

Maragues Points 9461

Le chemin d'accès correct à la carte SD est le suivant

/mnt/sdcard/

mais, comme il a été répondu précédemment, vous ne devriez pas le coder en dur. Si vous êtes sous Android 2.1 ou après, utilisez

getExternalFilesDir(String type) 

Dans le cas contraire :

Environment.getExternalStorageDirectory()

Lire attentivement https://developer.Android.com/guide/topics/data/data-storage.html#filesExternal

Vous devrez également utiliser cette méthode ou quelque chose de similaire

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

puis vérifiez si vous pouvez accéder à la carte SD. Comme indiqué, lisez la documentation officielle.

Une autre option consiste peut-être à utiliser mkdirs au lieu de mkdir

file.mkdirs()

Crée le répertoire nommé par le nom de fichier qui suit ce fichier, y compris le chemin d'accès complet au répertoire nécessaire pour créer ce répertoire.

2 votes

Il n'y a pas de getExternalFilesDir() en Environment dans toutes les versions d'Android. Vous pensez peut-être à getExternalFilesDir() en Context qui a été ajoutée dans la version 2.2. Cependant, cette méthode est quelque peu défaillante -- le répertoire qu'elle vous donne verra son contenu supprimé lors d'une mise à jour de l'application. J'espère que cela sera corrigé dans Gingerbread.

0 votes

Merci, c'est corrigé. J'ai parcouru rapidement la section sur le stockage des données et j'ai supposé qu'on y accédait comme getExternalStorageDirectory(), ce que j'utilise.

0 votes

Comme indiqué, j'ai testé l'état. L'état m'indique qu'il est monté, mais je ne parviens pas à créer un dossier.

15voto

Uriel Frankel Points 2143

Redémarrage votre appareil Android. Les choses ont commencé à fonctionner pour moi après avoir redémarré l'appareil.

1 votes

+1, cela a fonctionné pour l'appareil sur lequel je travaillais. mais je suis curieux de savoir pourquoi cela se produit ?

0 votes

Je pense que j'ai débogué mon application et que l'un des verrous d'écriture s'est verrouillé et n'a jamais été libéré.

0 votes

Utiliser mediaScan ou sendbroadcast à Media_mount afin de rafraîchir le magasin de médias avec les nouveaux répertoires. stackoverflow.com/questions/3300137/

6voto

Bala Vishnu Points 327

Utiliser mkdirs() au lieu de mkdir() ça a marché pour moi :)

File folder = new File(Environment.getExternalStorageDirectory()+"/Saved CGPA");
if(!folder.exists()){
    if(folder.mkdirs())
    Toast.makeText(this, "New Folder Created", Toast.LENGTH_SHORT).show();
}

File sdCardFile = new File(Environment.getExternalStorageDirectory()+"/Saved CGPA/cgpa.html");

1voto

Matthieu Points 8603

Avez-vous les bonnes permissions pour écrire sur la carte SD dans votre manifeste ? Recherchez WRITE_EXTERNAL_STORAGE à l'adresse suivante http://developer.Android.com/reference/Android/Manifest.permission.html

0 votes

Oui, j'ai ajouté cette ligne dans le fichier manifest de l'application tag, mais le répertoire n'est toujours pas créé.

0 votes

Si vous exécutez votre application en utilisant l'API 23, vous devez d'abord demander l'autorisation à l'utilisateur. developer.Android.com/training/permissions/requesting.html

0 votes

Bishoy - Ce n'est pas tout à fait vrai. Vous devez demander l'autorisation en cours d'exécution uniquement lorsque vous ciblez l'API 23 et plus. Si vous ciblez un SDK inférieur, vous n'avez pas à demander d'autorisation d'exécution, même si vous utilisez le SDK 23+.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X