Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

How to efficiently create subfolders using Storage Access Framework?

I'm currently using the below code to create subfolder in MicroSD on Lollipop using SAF

    String[] folders = fullFolderName.replaceFirst(UriFolder + "/", "").split("/");
    //fullFolderName is a String which represents full path folder to be created 
    //Here fullFolderName = /storage/MicroSD/MyPictures/Wallpapers
    ///storage/MicroSD/MyPictures/ already exists
    //Wallpapers is the folder to be created
    //UriFolder is String and contains /storage/MicroSD
    //folders[] will have folders[0]="MyPictures" folders[1]="Wallpapers"

    DocumentFile Directory = DocumentFile.fromTreeUri(context, Uri.parse(treeUri));
    //treeUri is the uri pointing to /storage/MicroSD
    //treeUri is a Uri converted to String and Stored so it needs to parsed back to Uri
    DocumentFile tempDirectory = Directory;

    //below loop will iterate and find the MyPictures or the parent
    //directory under which new folder needs to be created
    for(int i=0; i < folders.length-1; i++)
    {
        for(DocumentFile dir : Directory.listFiles())
        {
            if(dir.getName() != null && dir.isDirectory())
            {
                if (dir.getName().equals(folders[i]))
                {
                    tempDirectory = dir;
                    break;
                }
            }
        }
        Directory = tempDirectory;
    }

    Directory.createDirectory(folders[folders.length-1]);

The above code works fine and creates subdirectory but it takes ~5 Secs to create the folder. I'm new to SAF so is this the only way to locate subdirectories or is there any other efficient way to create subdirectories?

On internal storage I will use

new File(fullFolderName).mkdir();

Which will create folder in a fraction of second.

like image 316
Ram Kumar Avatar asked Dec 02 '25 13:12

Ram Kumar


1 Answers

Here is a bit efficient way to create

public static boolean createFolderUsingUri(String fullFolderName,String treeUri,
                                           String UriFolder,Context ctx)
{
    String[] folders = fullFolderName.replaceFirst(UriFolder + "/", "").split("/");

//fullFolderName is a String which represents full path folder to be created 
//Example: fullFolderName = /storage/MicroSD/MyPictures/Wallpapers
//The path /storage/MicroSD/MyPictures/ already exists 
//Wallpapers is the folder to be created
//UriFolder is String and contains string like /storage/MicroSD
//folders[] will have folders[0]="MyPictures" folders[1]="Wallpapers"
//treeUri string representation of Uri /storage/MicroSD 
//Ex: treeUri content://uritotheMicroSdorSomepath.A33%0A

    DocumentFile Directory = DocumentFile.fromTreeUri(ctx, Uri.parse(treeUri));

    for(int i=0; i < folders.length-1; i++)
    {
        Directory=Directory.findFile(folders[i]);
    }

    Directory.createDirectory(folders[folders.length-1]);
    return true;
}

The method described in question took ~5 Secs, whereas this method takes ~ 3 Secs. On CM file manage the folder creation on same path took ~4 Secs so this is comparatively faster method. Yet searching more faster way which will take < 1 Sec

like image 89
Ram Kumar Avatar answered Dec 05 '25 04:12

Ram Kumar



Donate For Us

If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!