Как эффективно создавать вложенные папки с помощью Storage Access Framework?

В настоящее время я использую приведенный ниже код для создания подпапки в MicroSD на Lollipop с использованием 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]);

Приведенный выше код отлично работает и создает подкаталог, но для создания папки требуется ~ 5 секунд. Я новичок в SAF, так что это единственный способ найти подкаталоги или есть другой эффективный способ создания подкаталогов?

На внутренней памяти я буду использовать

new File(fullFolderName).mkdir();

Который создаст папку за доли секунды.


person Ram Kumar    schedule 23.08.2015    source источник
comment
//treeUri is the uri pointing to /storage/MicroSD. Это больше похоже на строку. Зачем вам анализировать uri в заявлении над ним?   -  person greenapps    schedule 23.08.2015
comment
Удалить второй цикл for. Вы можете удалить весь код из тела первого цикла for. Затем поместите в него Directory.createDirectory(folders[i]);. Удалите последний оператор, так как он сейчас находится в цикле. Удалите -1 из итератора.   -  person greenapps    schedule 23.08.2015
comment
Хм, кажется, я понял тебя неправильно. Вы хотите что-то вроде mkdirs()? А есть только mkdir()? Итак, вам нужно реализовать mkdirs() самостоятельно? Пожалуйста, переформатируйте блок кода, чтобы нам не приходилось каждый раз прокручивать вправо, чтобы увидеть пути.   -  person greenapps    schedule 23.08.2015
comment
Теперь мне кажется, что вы хотите создать каталог /storage/MicroSD/MyPictures/Wallpapers. И на данный момент существует только /storage/MicroSD. В том, что все?   -  person greenapps    schedule 23.08.2015
comment
@greenapps, переформатировал вопрос, /storage/MicroSD/MyPictures/ уже существует, только каталог обоев нужно создать в /storage/MicroSD/MyPictures/.   -  person Ram Kumar    schedule 23.08.2015
comment
Тогда в чем проблема? И каково значение и тип treeUri?   -  person greenapps    schedule 23.08.2015
comment
@greenapps, treeUri — это строка (Uri преобразуется в строку), которая снова анализируется в Uri. Приведенный выше код работает нормально, но требуется некоторое время для повторения и перехода к дочерней папке, эффективность снижается по мере увеличения количества дочерних папок.   -  person Ram Kumar    schedule 23.08.2015
comment
В третий раз: что содержит treeUri? Какова его ценность.? Ваш код слишком сложен для такой простой задачи.   -  person greenapps    schedule 23.08.2015
comment
@greenapps , как указано в приведенном выше коде --› treeUri — это uri, указывающий на /storage/MicroSD, который фактически выбран пользователем. Пожалуйста, пройдите вопрос полностью один раз.   -  person Ram Kumar    schedule 23.08.2015
comment
'treeUri — это uri, указывающий на /storage/MicroSD'. ??? treeUri была строкой, которую вы сказали. Теперь значение/содержимое этой строки /storage/MicroSD? Тогда почему бы просто не сказать так, ведь это все, о чем я просил. Далее ваш код не будет полным, если вы не начнете с одного чистого treeUri и не покажете нам, откуда берутся folderNames и какое это имеет отношение к treeUri.   -  person greenapps    schedule 23.08.2015


Ответы (1)


Вот немного эффективный способ создания

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

Описанный метод занял ~ 5 секунд, тогда как этот метод занимает ~ 3 секунды. В файле CM управление созданием папки по тому же пути заняло ~ 4 секунды, так что это сравнительно более быстрый метод. Но поиск более быстрого пути, который займет ‹ 1 сек.

person Ram Kumar    schedule 25.08.2015