SDカードにディレクトリを自動的に作成する方法


189

次の場所にファイルを保存しようとしています
FileOutputStream fos = new FileOutputStream("/sdcard/Wallpaper/"+fileName); が、例外が発生します。java.io.FileNotFoundException
ただし、パスを機能さ"/sdcard/"せると、

この方法でディレクトリを自動的に作成できないと仮定します。

誰かがdirectory and sub-directoryusingコードを作成する方法を提案できますか?

回答:


449

トップレベルのディレクトリをラップするFileオブジェクトを作成する場合、そのオブジェクトのmkdirs()メソッドを呼び出して、必要なすべてのディレクトリを構築できます。何かのようなもの:

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

注:「SDカード」ディレクトリを取得するには、Environment.getExternalStorageDirectory()を使用するのが賢明な場合があります。これは、SDカード以外のもの(内蔵フラッシュ、 iPhone)。どちらの方法でも、SDカードが取り外されている可能性があるため、実際にそこにあることを確認する必要があることに注意してください。

更新: APIレベル4(1.6)以降、権限もリクエストする必要があります。次のようなもの(マニフェスト内)が機能するはずです。

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

1
はい、その後リリースされたSamsungタブレットは内蔵フラッシュを使用しています
CQM

2
AndroidManifest.xmlに、stackoverflow.com
a / 4435708/579646

1
/sdcard/com.my.code/dataのようなサブサブフォルダーがある場合、これは機能しません。どうすればこれを解決できますか?
lony

このディレクトリも作成しますか?UNIX mkdirに「force」のようなコマンドはありますか?
lony

4
KitKat、外部、物理sdカードでは機能しません。
セロフティス2014

57

同じ問題があり、AndroidManifest.xmlにもこの権限が必要であることを追加したいだけです。

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

39

ここに私のために働くものがあります。

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

あなたのマニフェストと以下のコードで

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

pathは、作成するフォルダの名前です。MusicDownloadなどのパスを送信した場合、自動的に/ sdcard / MusicDownloadになります。Shajeel Afzal
2015

それは例外java.io.IOExceptionをスローします:open failed:ENOENT(そのようなファイルまたはディレクトリはありません)
Anand Savjani

24

実際、私は@fiXedd asnwerの一部を使用し、それは私のために働いた:

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

完全なパスを作成するために、mkdir()ではなくmkdirs()を使用していることを確認してください


@fixedd回答のこの「部分」はどうですか?彼の答えは使用することFile.mkdirs()でした。次に、それを使用する例を示しました。
Doomsknight 2012

実際には何が違うのか思い出せませんが、いくつかの編集があったと思います...ところで、私は彼の答えを使って解決策を得たと述べました
Amt87

12

API 8以降では、SDカードの場所が変更されました。@fiXeddの答えは良いですが、より安全なコードのためにEnvironment.getExternalStorageState()、メディアが利用可能かどうかを確認するために使用する必要があります。次に、を使用getExternalFilesDir()して目的のディレクトリに移動できます(API 8以降を使用している場合)。

詳細については、SDKのドキュメントをご覧ください。


8

外部ストレージが存在することを確認します: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);
    }

6

ファイル/フォルダ名に特殊文字が含まれていないことを確認することを忘れないでください。変数を使用してフォルダ名を設定しているときに、「:」で私に起こった

ファイル/フォルダ名に使用できない文字

"* /:<>?\ |

このような場合に、このコードが役立つことがあります。

以下のコードは、すべての「:」を削除し、それらを「-」に置き換えます

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

+1 ya私も試してみました:エラーが発生し、最終的にその問題を見つけて削除しました:他のすべての特殊文字。
Ganapathy C 2013

6

私も同じ問題に直面しました。Androidには2種類の権限があります。

  • 危険(連絡先へのアクセス、外部ストレージへの書き込み...)
  • 通常 (通常の権限はAndroidによって自動的に承認されますが、危険な権限はAndroidユーザーによって承認される必要があります。)

Android 6.0で危険な権限を取得する方法は次のとおりです

  • 権限が付与されているかどうかを確認してください
  • アプリにすでに権限が付与されている場合は、先に進んで通常どおり実行してください。
  • アプリにまだ権限がない場合は、ユーザーに承認を依頼します
  • でユーザーの承認を聞く onRequestPermissionsResult

これが私のケースです:外部ストレージに書き込む必要があります。

まず、許可があるかどうかを確認します。

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

次に、ユーザーの承認を確認します。

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

5

同じ問題に直面していて、Galaxy Sでディレクトリを作成できませんでしたが、NexusとSamsung Droidでディレクトリを正常に作成できました。修正方法は、次のコード行を追加することでした。

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

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

これにより、SDカードにdorという名前のフォルダーが作成されます。次に、手動でdorフォルダーに挿入されたeg- filename.jsonのファイルをフェッチします。お気に入り:

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

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

マニフェストにコードを追加することを忘れないでください


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

3

Vijayの投稿を完了するだけ...


マニフェスト

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

関数

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

使用法

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

エラーをチェックできます

if(createDirIfNotExists("mydir/")){
     //Directory Created Success
}
else{
    //Error
}

3

これにより、指定したフォルダー名でsdcardにフォルダーが作成されます。

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

1

Environment.getExternalStorageDirectory()の代わりに/ sdcard /を使用できます

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

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

4
いいえ、適切なAPIを呼び出すのではなく、ハードコードされたパスを使用しないでください。そうすることは、特定の実装の詳細への賢明でない依存をもたらします。
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);

        }
    });`
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.