Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

List of files in assets folder and its subfolders

Tags:

android

assets

People also ask

What does asset folder contain?

Assets provide a way to add arbitrary files like text, XML, HTML, fonts, music, and video in the application. If one tries to add these files as “resources“, Android will treat them into its resource system and you will be unable to get the raw data.

What are files/folders and subfolders?

A folder holds one or more files, and a folder can be empty until it is filled. A folder can also contain other folders, and there can be many levels of folders within folders. Folders within a folder are technically known as "subfolders," but this distinction is often disregarded.


private boolean listAssetFiles(String path) {

    String [] list;
    try {
        list = getAssets().list(path);
        if (list.length > 0) {
            // This is a folder
            for (String file : list) {
                if (!listAssetFiles(path + "/" + file))
                    return false;
                else {
                    // This is a file
                    // TODO: add file name to an array list
                }
            }
        } 
    } catch (IOException e) {
        return false;
    }

    return true; 
} 

Call the listAssetFiles with the root folder name of your asset folder.

    listAssetFiles("root_folder_name_in_assets");

If the root folder is the asset folder then call it with

    listAssetFiles("");    

try this it will work in your case

f = getAssets().list("");
for(String f1 : f){
    Log.v("names",f1);
}

The above snippet will show the contents of the asset root.

For example... if below is the asset structure..

assets
 |__Dir1
 |__Dir2
 |__File1

Snippet's output will be .... Dir1 Dir2 File1

If you need the contents of the Directory Dir1

Pass the name of Directory in the list function.

  f = getAssets().list("Dir1");

Hope This Help:

following code will copy all the folder and it's content and content of sub folder to sdcard location:

 private void getAssetAppFolder(String dir) throws Exception{

    {
        File f = new File(sdcardLocation + "/" + dir);
        if (!f.exists() || !f.isDirectory())
            f.mkdirs();
    }
     AssetManager am=getAssets();

     String [] aplist=am.list(dir);

     for(String strf:aplist){
        try{
             InputStream is=am.open(dir+"/"+strf);
             copyToDisk(dir,strf,is);
         }catch(Exception ex){


            getAssetAppFolder(dir+"/"+strf);
         }
     }



 }


 public void copyToDisk(String dir,String name,InputStream is) throws IOException{
     int size;
        byte[] buffer = new byte[2048];

        FileOutputStream fout = new FileOutputStream(sdcardLocation +"/"+dir+"/" +name);
        BufferedOutputStream bufferOut = new BufferedOutputStream(fout, buffer.length);

        while ((size = is.read(buffer, 0, buffer.length)) != -1) {
            bufferOut.write(buffer, 0, size);
        }
        bufferOut.flush();
        bufferOut.close();
        is.close();
        fout.close();
 }

Here is a solution to my problem that I found out working 100% listing all directories and files even sub-directories and files in subdirectories.

Note: In my case

  1. Filenames had a . in them. i.e. .htm .txt etc
  2. Directorynames did not have any . in them.

    listAssetFiles2(path); // <<-- Call function where required
    
    
    //function to list files and directories
    public void listAssetFiles2 (String path){
    String [] list;
    
    try {
        list = getAssets().list(path);
        if(list.length > 0){
            for(String file : list){
                System.out.println("File path = "+file);
    
                if(file.indexOf(".") < 0) { // <<-- check if filename has a . then it is a file - hopefully directory names dont have . 
                    System.out.println("This is a folder = "+path+"/"+file);
                    listAssetFiles2(file); // <<-- To get subdirectory files and directories list and check 
                }else{
                    System.out.println("This is a file = "+path+"/"+file);
                }
            }
    
        }else{
            System.out.println("Failed Path = "+path);
            System.out.println("Check path again.");
        }
    }catch(IOException e){
        e.printStackTrace();
    }
    }//now completed
    

Thanks


Based on the @Kammaar answer. This kotlin code scans the file tree for the leafs:

private fun listAssetFiles(path: String, context: Context): List<String> {
    val result = ArrayList<String>()
    context.assets.list(path).forEach { file ->
        val innerFiles = listAssetFiles("$path/$file", context)
        if (!innerFiles.isEmpty()) {
            result.addAll(innerFiles)
        } else {
            // it can be an empty folder or file you don't like, you can check it here
            result.add("$path/$file")
        }
    }
    return result
}