2010-01-25 4 views
171

J'essaie de sauver mon dossier à 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 que "/sdcard/" cela fonctionne.Comment créer automatiquement un répertoire sur la carte SD

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

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

Répondre

422

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

Note: Il pourrait être judicieux d'utiliser Environment.getExternalStorageDirectory() pour obtenir le répertoire « carte SD », car cela pourrait changer si un téléphone vient le long qui a quelque chose d'autre qu'une carte SD (tel que construit -en flash, a'la l'iPhone). De toute façon, vous devez garder à l'esprit que vous devez vérifier pour vous assurer qu'il est bien là car la carte SD peut être retirée.

MISE À JOUR: Depuis API niveau 4 (1.6), vous devrez également demander la permission. Quelque chose comme cela (dans le manifeste) devrait fonctionner:

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

Merci fixXedd. Cela a fonctionné parfaitement. –

+2

Pas de problème. Heureux d'aider. –

+1

oui, les comprimés Samsung publié par la suite utilisent flash intégré – CQM

57

eu le même problème et que vous voulez juste ajouter que AndroidManifest.xml a aussi besoin de cette autorisation:

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

Avec API 8 et plus, la 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 média est disponible. Ensuite, vous pouvez utiliser getExternalFilesDir() pour naviguer vers le répertoire que vous voulez (en supposant que vous utilisez API 8 ou plus). Vous pouvez en lire plus dans le SDK documentation.

38

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

Comment dois-je passer l'adresse ici? comme "folderPath" ou "/ folderPath" ???? –

+0

path est le nom du dossier que vous voulez créer. Si vous avez envoyé un chemin comme MusicDownload .. Il devient automatiquement/sdcard/MusicDownload. Shajeel Afzal – shehzy

+0

Il jette une exception java.io.IOException: ouvrir a échoué: ENOENT (Pas de tel fichier ou répertoire) –

5

je faisais face au même problème, incapable de créer le répertoire sur Galaxy S, mais a pu créer avec succès sur Nexus et Samsung Droid.Comment je l'ai fixé était en ajoutant la ligne de code suivante:

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

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

En fait, j'utilisé une partie de @fiXedd asnwer 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() non mkdir() pour créer le chemin complet

+0

Comment cette "partie" de @fixedd répond-elle? Sa réponse était d'utiliser 'File.mkdirs()'. Il a ensuite montré un exemple de l'utiliser. – Doomsknight

+0

En fait, je ne me souviens pas quelle était la différence, mais je pense qu'il y avait quelques modifications ... En passant, j'ai mentionné que j'ai utilisé sa réponse pour obtenir la solution – Amt87

5

N'oubliez pas de vous assurer que vous n'avez aucun caractère spécial dans vos noms de fichier/dossier. Il me est arrivé avec ":" quand je mettais les noms de dossier en utilisant la variable (s)

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

"* /: <> \ |

U peut trouver ce code utile dans ce cas

Le code ci-dessous supprime tous « : » 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"); 
     } 
    } 
.
+0

+1 ya trop essayé avec: et j'ai eu une erreur et finalement trouvé ce problème et supprimé: et tous les autres caractères spéciaux. –

1

Vous pouvez utiliser/sdcard/au lieu de Environment.getExternalStorageDirectory()

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

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

Non, vous ne devez pas utiliser un chemin codé en dur au lieu d'appeler l'API appropriée. Cela introduit une dépendance imprudente sur les détails d'une implémentation particulière. –

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

cela va créer un dossier nommé dor dans votre sdcard. puis d'extraire le fichier pour eg-fichier.json qui est inséré manuellement dans le dossier dor. Comme:

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

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

et ne pas oublier d'ajouter du code dans le manifeste

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

achevons la Le message 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; 
} 

Utilisation

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

je fait face au même problème. Il existe deux types d'autorisations dans Android:

  • Dangerous (accès aux contacts, écrire au stockage externe ...)
  • normal (autorisations normales sont automatiquement approuvés par Android alors que les autorisations dangereuses doivent être approuvé 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 votre application est déjà accordée la permission, allez-y et effectuez normalement.
  • Si votre application ne dispose pas de l'autorisation encore, demandez l'utilisateur d'approuver
  • Écoutez l'approbation de l'utilisateur dans onRequestPermissionsResult

Voici mon cas: je dois écrire au stockage externe.

D'abord, je vérifier si j'ai la permission:

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

vérifier ensuite 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(); 
      } 
     } 
    }  
} 
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); 

     } 
    });` 
3

Cela fera dossier sdcard avec le nom du dossier que vous fournissez .

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