2015-08-23 2 views
1

настоящее время я использую следующий код, чтобы создать вложенную в MicroSD на леденец с помощью SAFКак эффективно создавать подпапки с использованием Storage Access Framework?

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(); 

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

+0

'// treeUri - это uri, указывающий на/storage/MicroSD'. Это больше похоже на String. Как вы могли бы разобрать uri в заявлении над ним? – greenapps

+0

Снимите второй цикл. Вы можете удалить весь код из тела первого цикла for. Затем поместите 'Directory.createDirectory (папки [i]);' в нем. Удалите последнее утверждение, как оно теперь находится в цикле. Удалите «-1» из итератора. – greenapps

+0

Хм, я верю, что понял, что ты ошибаешься. Вы хотите своего рода mkdirs()? А есть только mkdir()? Значит, вам нужно реализовать mkdirs() самостоятельно? Пожалуйста, переформатируйте свой блок кода, поэтому нам не нужно прокручивать каждый раз вправо, чтобы видеть пути. – greenapps

ответ

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 Sec

Смежные вопросы