[android] SD 카드에서 자동으로 디렉토리를 만드는 방법

파일을 다음 위치에 저장하려고하는데
FileOutputStream fos = new FileOutputStream("/sdcard/Wallpaper/"+fileName);
예외가 발생합니다. java.io.FileNotFoundException
그러나 경로를 다음과 같이 입력하면"/sdcard/" 작동 합니다.

이제는이 방법으로 디렉토리를 자동으로 만들 수 없다고 가정합니다.

누군가가 directory and sub-directory사용 코드 를 만드는 방법을 제안 할 수 있습니까 ?



답변

당신이 작성하는 경우 파일의 최상위 디렉토리를 래핑 개체를 당신은 그것의 호출 할 수 있습니다 () 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" />


답변

같은 문제가 있었고 AndroidManifest.xml 에도이 권한이 필요하다는 것을 추가하고 싶습니다.

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


답변

여기 나를 위해 일하는 것이 있습니다.

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


답변

실제로 나는 @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 ()를 사용하고 있는지 확인하십시오.


답변

API 8 이상에서는 SD 카드의 위치가 변경되었습니다. @fiXedd의 답변은 좋지만 더 안전한 코드를 위해서는 Environment.getExternalStorageState()미디어가 사용 가능한지 확인 해야 합니다. 그런 다음 getExternalFilesDir()API 8 이상을 사용한다고 가정하여 원하는 디렉토리로 이동할 수 있습니다 .

SDK 설명서 에서 자세한 내용을 읽을 수 있습니다 .


답변

외부 저장소가 있는지 확인하십시오 :
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);
    }


답변

파일 / 폴더 이름에 특수 문자가 없는지 확인하십시오. 변수를 사용하여 폴더 이름을 설정할 때 “:”로 나에게 일어났습니다.

파일 / 폴더 이름에 허용되지 않는 문자

“* / : <>? \ |

이런 경우이 코드가 도움이 될 수 있습니다.

아래 코드는 모든 “:”를 제거하고 “-“로 바꿉니다.

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