So erstellen Sie ein Verzeichnis automatisch auf einer SD-Karte

189

Ich versuche, meine Datei am folgenden Speicherort zu speichern,
FileOutputStream fos = new FileOutputStream("/sdcard/Wallpaper/"+fileName); erhalte jedoch die Ausnahme java.io.FileNotFoundException
, wenn ich den Pfad so einfüge, wie "/sdcard/"er funktioniert.

Jetzt gehe ich davon aus, dass ich auf diese Weise kein Verzeichnis automatisch erstellen kann.

Kann jemand vorschlagen, wie man directory and sub-directorymit Code erstellt?

Kshitij Aggarwal
quelle

Antworten:

449

Wenn Sie ein erstellen Dateiobjekt, das die Top-Level - Verzeichnis hüllt können Sie es nennen mkdirs () Methode , um alle benötigten Verzeichnisse zu bauen. Etwas wie:

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

Hinweis: Es ist möglicherweise ratsam, Environment.getExternalStorageDirectory () zu verwenden. zum Abrufen des Verzeichnisses "SD-Karte" zu verwenden, da sich dies ändern kann, wenn ein Telefon mit einer anderen Karte als einer SD-Karte (z. B. integriertem Flash) verwendet wird iPhone). In jedem Fall sollten Sie bedenken, dass Sie überprüfen müssen, ob es tatsächlich vorhanden ist, da die SD-Karte möglicherweise entfernt wird.

UPDATE: Seit API Level 4 (1.6) müssen Sie auch die Berechtigung anfordern. So etwas (im Manifest) sollte funktionieren:

<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
Jeremy Logan
quelle
1
Ja, die später veröffentlichten Samsung-Tablets verwenden eingebauten Flash
CQM
2
Vergessen Sie nicht, der AndroidManifest.xml das Recht hinzuzufügen, stackoverflow.com/a/4435708/579646
max4ever
1
Es scheint, dass dies nicht funktioniert, wenn ich einen Unter-Unterordner wie /sdcard/com.my.code/data? Wie könnte ich das lösen?
Lony
Neben der Erstellung dieses Verzeichnisses auch? Gibt es einen Befehl wie 'force' in Unix mkdir?
Lony
4
Funktioniert nicht mit KitKat, externen, physischen SD-Karten.
Celoftis
57

Hatte das gleiche Problem und möchte nur hinzufügen, dass AndroidManifest.xml auch diese Berechtigung benötigt:

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

Folgendes funktioniert bei mir.

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

in Ihrem Manifest und dem Code unten

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;
}
Vijay Kumar AB
quelle
Pfad ist der Name des Ordners, den Sie erstellen möchten. Wenn Sie einen Pfad wie MusicDownload gesendet haben, wird dieser automatisch zu / sdcard / MusicDownload. Shajeel Afzal
shehzy
Es löst eine Ausnahme aus java.io.IOException: Öffnen fehlgeschlagen: ENOENT (Keine solche Datei oder kein solches Verzeichnis)
Anand Savjani
24

Eigentlich habe ich einen Teil von @fiXedd asnwer verwendet und es hat bei mir funktioniert:

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

Stellen Sie sicher, dass Sie mkdirs () und nicht mkdir () verwenden, um den vollständigen Pfad zu erstellen

Amt87
quelle
Wie ist dieser "Teil" der @ fixedd Antwort? Seine Antwort war zu verwenden File.mkdirs(). Er zeigte dann ein Beispiel für die Verwendung.
Doomsknight
Eigentlich kann ich mich nicht erinnern, was der Unterschied war, aber ich denke, es gab einige Änderungen ... Übrigens habe ich erwähnt, dass ich seine Antwort verwendet habe, um die Lösung zu erhalten
Amt87
12

Mit API 8 und höher hat sich der Speicherort der SD-Karte geändert. Die Antwort von @ fiXedd ist gut, aber für sichereren Code sollten Sie Environment.getExternalStorageState()überprüfen, ob die Medien verfügbar sind. Dann können Sie verwendengetExternalFilesDir() Sie zu dem gewünschten Verzeichnis navigieren (vorausgesetzt, Sie verwenden API 8 oder höher).

Weitere Informationen finden Sie in der SDK-Dokumentation .

Nick Ruiz
quelle
8

Stellen Sie sicher, dass externer Speicher vorhanden ist: 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);
    }
Parth mehta
quelle
6

Vergessen Sie nicht sicherzustellen, dass Ihre Datei- / Ordnernamen keine Sonderzeichen enthalten. Ist mir mit ":" passiert, als ich Ordnernamen mit Variablen festgelegt habe

Nicht erlaubte Zeichen in Datei- / Ordnernamen

"* /: <>? \ |

In einem solchen Fall kann dieser Code hilfreich sein.

Der folgende Code entfernt alle ":" und ersetzt sie durch "-"

//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");
        }
    }
Praveen
quelle
+1 ya ich habe es auch versucht mit: und habe einen Fehler bekommen und schließlich das Problem gefunden und entfernt: und alle anderen Sonderzeichen.
Ganapathy C
6

Ich hatte das gleiche Problem. In Android gibt es zwei Arten von Berechtigungen:

  • Gefährlich (Zugriff auf Kontakte, Schreiben in externen Speicher ...)
  • Normal (Normale Berechtigungen werden automatisch von Android genehmigt, während gefährliche Berechtigungen von Android-Benutzern genehmigt werden müssen.)

Hier ist die Strategie, um gefährliche Berechtigungen in Android 6.0 zu erhalten

  • Überprüfen Sie, ob Ihnen die Berechtigung erteilt wurde
  • Wenn Ihrer App bereits die Berechtigung erteilt wurde, führen Sie die normale Ausführung aus.
  • Wenn Ihre App noch nicht über die Berechtigung verfügt, bitten Sie den Benutzer um Genehmigung
  • Hören Sie sich die Benutzergenehmigung in an onRequestPermissionsResult

Hier ist mein Fall: Ich muss in einen externen Speicher schreiben.

Zuerst überprüfe ich, ob ich die Erlaubnis habe:

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

Überprüfen Sie dann die Zustimmung des Benutzers:

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

Ich hatte das gleiche Problem, konnte kein Verzeichnis auf dem Galaxy S erstellen, konnte es jedoch erfolgreich auf Nexus und Samsung Droid erstellen. Wie ich es behoben habe, war durch Hinzufügen der folgenden Codezeile:

File dir = new File(Environment.getExternalStorageDirectory().getPath()+"/"+getPackageName()+"/");
dir.mkdirs();
Garima Srivastava
quelle
5
File sdcard = Environment.getExternalStorageDirectory();
File f=new File(sdcard+"/dor");
f.mkdir();

Dadurch wird ein Ordner mit dem Namen dor auf Ihrer SD-Karte erstellt. dann, um die Datei für eg- filename.json abzurufen, die manuell in den Ordner dor eingefügt wird . Mögen:

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

<Verwendungsberechtigung android: name = "android.permission.WRITE_EXTERNAL_STORAGE" />

und vergessen Sie nicht, Code im Manifest hinzuzufügen

jayant singh
quelle
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);
vikseln
quelle
3

Vervollständige gerade den Beitrag des Vijay ...


Manifest

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

Funktion

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

Verwendung

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

Sie könnten nach Fehlern suchen

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

Dadurch wird ein Ordner auf der SD-Karte mit dem von Ihnen angegebenen Ordnernamen erstellt.

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

Sie können / sdcard / anstelle von Environment.getExternalStorageDirectory () verwenden.

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

File dbdir = new File(DB_PATH);
dbdir.mkdirs();
Peter Drinnan
quelle
4
Nein, Sie sollten keinen fest codierten Pfad verwenden, anstatt die richtige API aufzurufen. Dies führt zu einer unklugen Abhängigkeit von den Details einer bestimmten Implementierung.
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);

        }
    });`
Vishnu Namboodiri
quelle