2

I am trying to create folders and files in external storage directory through application.

    File f = new File("/storage/emulated/0", mFileName);
    boolean isCreated = f.mkdir();

This is always successful and isCreated is true with out any exception or warnings and folder is created.

Environment.getExternalStorageDirectory() returns "/storage/emulated/0" too.

But when I try to create folder in external storage card(removable memory card) as follows:

    File f = new File("/storage/6161-3165", mFileName);
     boolean isCreated = f.mkdir();

Always f.mkdir() returns false and the folder is not created. Meanwhile I can see W/System.err: ... in logcat as follows:

    **02-22 14:50:47.551 13536-13536/com.testapp.extsd W/System.err: mkdir failed: EACCES (Permission denied) : /storage/6161-3165/uyyyy**

I have mentioned WRITE_EXTERNAL_STORAGE permissions in manifest file. Still folder is not created.

I want to know how to create folder and file in external card storage.

the file structure of storage in my mobile is:

shell@j7xelte:/storage $ ls -l
drwxrwx--x root     sdcard_rw          2017-02-05 07:59 6161-3165
drwx--x--x root     sdcard_rw          2016-01-01 17:34 emulated
drwxr-xr-x system   system            2017-02-05 07:59 enc_emulated
drwxr-xr-x root     root              2017-02-05 07:59 self

shell@j7xelte:/storage $

Waiting for the response...

user2318724
  • 259
  • 5
  • 16

2 Answers2

0

First of all you have to add some permission to your AndroidManifest

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

To create folder in external storage, call something like this

String folder_main = "NewFolder";

File f = new File(Environment.getExternalStorageDirectory(), folder_main);
if (!f.exists()) {
    f.mkdirs();
}

Also, for Android >6 you have to call runtime permission

ActivityCompat.requestPermissions(this, new String[]{Manifest.permission.WRITE_EXTERNAL_STORAGE}, REQUEST_CODE);

get result

@Override
public void onRequestPermissionsResult(int requestCode, String[] permissions, int[] grantResults) {
    super.onRequestPermissionsResult(requestCode, permissions, grantResults);
    if(grantResults[0]== PackageManager.PERMISSION_GRANTED){
        Log.v(TAG,"Permission: "+permissions[0]+ "was "+grantResults[0]);
        //resume tasks needing this permission
    }
}

and check it

if (checkSelfPermission(android.Manifest.permission.WRITE_EXTERNAL_STORAGE) == PackageManager.PERMISSION_GRANTED) {
    Log.v(TAG,"Permission is granted");
    //File write logic here
    return true;
}
Anton A.
  • 1,718
  • 15
  • 37
  • Already permissions are added. Environment.getExternalStorageDirectory() api return "/storage/emulated/0" But I want to create folder in "/storage/6161-3165" I have checked app permissions in settings/applications list. Its shown as storage permissions granted. – user2318724 Feb 22 '17 at 12:04
  • @user2318724 /storage/ is not external dir. It is system dir, you can create dirs or files there only with root permision – Anton A. Feb 22 '17 at 12:07
  • I am not trying create folder/file under /storage/ path. With adb shell, under storage folder, we will get following folder list. shell@j7xelte:/storage $ ls -l drwxrwx--x root sdcard_rw 2017-02-05 07:59 6161-3165 drwx--x--x root sdcard_rw 2016-01-01 17:34 emulated drwxr-xr-x system system 2017-02-05 07:59 enc_emulated drwxr-xr-x root root 2017-02-05 07:59 self Both emulated and 6161-3165(SD card is displayed like this) are under root folder. With file.mkdir(), we can create folder under emulated/0/ folder. – user2318724 Feb 22 '17 at 12:53
  • @user2318724 I cant find any info about folder named 6161-3165 in emulated folder – Anton A. Feb 22 '17 at 16:01
  • in my mobile, on SD card is inserted, in file system it is displayed with 6161-3165. shell@j7xelte:/storage $ ls -l drwxrwx--x root sdcard_rw 2017-02-05 07:59 6161-3165 ---> this is external memory card. drwx--x--x root sdcard_rw 2016-01-01 17:34 emulated drwxr-xr-x system system 2017-02-05 07:59 enc_emulated drwxr-xr-x root root 2017-02-05 07:59 self I hope you understand the query. – user2318724 Feb 23 '17 at 06:36
0

Try this code out ....

String externalDataPath = Environment.getExternalStorageDirectory() + "/yourFolder";
File f = new File(externalDataPath);
try {
      if (!f.exists()) {
           f.mkdir();
            }
      externalDataPath = externalDataPath + "/" + filename;
      f = new File(externalDataPath);

      if (!f.exists())
           f.createNewFile();

     externalDataPath = Environment.getExternalStorageDirectory().toString();
} catch (IOException e) {
            e.printStackTrace();
        }

Hope this helps :)

Ayush Bansal
  • 702
  • 1
  • 7
  • 17
  • Ayush.. Environment.getExternalStorageDirectory() api return "/storage/emulated/0" But I want to create folder in "/storage/6161-3165" – user2318724 Feb 22 '17 at 12:02