Question

Je suis en train d'enregistrer 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.

Je suppose que je ne suis pas en mesure de créer le répertoire automatiquement de cette façon.

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

Était-ce utile?

La solution

Si vous créez un Fichier objet qui enveloppe le haut niveau répertoire que vous pouvez appeler est mkdirs () méthode pour construire 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 est peut-être sage 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 (comme flash intégré, A'la l'iphone). De toute façon, vous devriez garder à l'esprit que vous devez vérifier pour vous assurer qu'il est vraiment là que la carte SD peut être retirée.

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

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

Autres conseils

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

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

En fait je partie de réponse @fiXedd 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 () ne mkdir () pour créer le chemin complet

Avec l'API 8 et plus, l'emplacement de la carte SD a changé. @ La réponse de fiXedd est bon, mais pour le code plus sûr, vous devez utiliser Environment.getExternalStorageState() pour vérifier si les médias est disponible. Ensuite, vous pouvez utiliser getExternalFilesDir() pour accéder au répertoire que vous voulez (en supposant que vous utilisez l'API 8 ou plus).

Vous pouvez en lire plus dans le documentation SDK .

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

Ne pas oublier de vous assurer que vous avez pas de caractères spéciaux dans vos noms de fichier / dossier. Il me est arrivé avec « : » quand je mettais les noms de dossier en utilisant la variable (s)

caractères non autorisés dans les noms de fichier / dossier

  

» * /: <> \ |

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

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

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

Voici mon cas. Je dois écrire au stockage externe

Tout d'abord, je vérifie 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érifiez 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();
            }
        }
    }    
}

Je faisais face au même problème, incapable de créer le répertoire sur Galaxy S, mais a été en mesure de 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();
File sdcard = Environment.getExternalStorageDirectory();
File f=new File(sdcard+"/dor");
f.mkdir();

cela va créer un dossier nommé dor dans votre sdcard. puis chercher le fichier pour filename.json EG- qui est inséré manuellement dans dor dossier. Comme:

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

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

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

Il suffit de remplir le poste de Vijay ...


Manifest

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
}
  

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

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

        }
    });`
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top