3

現在、以下のコードを使用して、SAFを使用してLollipopのMicroSDにサブフォルダーを作成しています

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

ほんの一瞬でフォルダーを作成します。

4

1 に答える 1

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 秒未満かかるより高速な方法を検索します。

于 2015-08-25T16:34:48.277 に答える