190

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

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

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

4

14 に答える 14

453

最上位ディレクトリをラップする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 カード以外のもの (内蔵フラッシュなど) を搭載した電話が登場した場合に変更される可能性があるためです。アイフォン)。いずれにしても、SD カードが取り外されている可能性があるため、実際にそこにあることを確認する必要があることに注意してください。

更新: API レベル 4 (1.6) 以降、パーミッションも要求する必要があります。このようなもの (マニフェスト内) が機能するはずです:

<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
于 2010-01-25T08:33:40.040 に答える
57

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

<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
于 2010-12-14T03:52:36.087 に答える
40

これが私にとってうまくいくものです。

 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;
}
于 2011-09-16T02:04:54.117 に答える
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() を使用していることを確認してください。

于 2012-04-03T09:17:53.117 に答える
12

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

詳細については、SDK ドキュメントを参照してください。

于 2011-03-01T15:36:16.537 に答える
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);
    }
于 2012-02-29T10:18:24.917 に答える
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");
        }
    }
于 2012-06-25T18:28:24.203 に答える
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();
            }
        }
    }    
}
于 2015-12-26T15:19:40.663 に答える
5

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

File dir = new File(Environment.getExternalStorageDirectory().getPath()+"/"+getPackageName()+"/");
dir.mkdirs();
于 2012-02-17T15:48:33.503 に答える
5
File sdcard = Environment.getExternalStorageDirectory();
File f=new File(sdcard+"/dor");
f.mkdir();

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

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

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

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

于 2014-06-09T10:45:46.850 に答える
3

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

File file = new File(Environment.getExternalStorageDirectory().getAbsolutePath() + "/Folder name");
        if (!file.exists()) {
            file.mkdirs();
        }
于 2016-12-02T06:03:40.290 に答える
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
}
于 2014-10-28T12:19:33.523 に答える
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);

        }
    });`
于 2016-02-19T07:30:00.927 に答える