List of files in assets folder and its subfolders

AndroidAssets

Android Problem Overview


I have some folders with HTML files in the "assets" folder in my Android project. I need to show these HTML files from assets' sub-folders in a list. I already wrote some code about making this list.

lv1 = (ListView) findViewById(R.id.listView);
// Insert array in ListView

// In the next row I need to insert an array of strings of file names
// so please, tell me, how to get this array

lv1.setAdapter(new ArrayAdapter<String>(this, android.R.layout.simple_list_item_1, filel));
lv1.setTextFilterEnabled(true);
// onclick items in ListView:
lv1.setOnItemClickListener(new OnItemClickListener() {
	public void onItemClick(AdapterView<?> a, View v, int position, long id) {
		//Clicked item position
		String itemname = new Integer(position).toString();  
        Intent intent = new Intent();
        intent.setClass(DrugList.this, Web.class);
        Bundle b = new Bundle();
        //I don't know what it's doing here
        b.putString("defStrID", itemname); 
        intent.putExtras(b);
        //start Intent
        startActivity(intent);
	}
});

Android Solutions


Solution 1 - Android

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

Solution 2 - Android

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

Solution 3 - Android

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

Solution 4 - Android

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

Solution 5 - Android

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
}

Solution 6 - Android

i think that this is best that check file is dir or not, altarnative try,catch!

 public static  List<String> listAssetFiles(Context c,String rootPath) {
    List<String> files =new ArrayList<>();
    try {
        String [] Paths = c.getAssets().list(rootPath);
        if (Paths.length > 0) {
            // This is a folder
            for (String file : Paths) {
                String path = rootPath + "/" + file;
                if (new File(path).isDirectory())
                    files.addAll(listAssetFiles(c,path));
                else files.add(path);
            }
        }
    } catch (IOException e) {
        e.printStackTrace();
    }
   return files;
}

Solution 7 - Android

This method return file names in a directory in Assets folder

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

For example you want to load music file path from sound folder

enter image description here

You can fetch all sound like this:

  private const val SOUND_DIRECTORY = "sound"


   fun fetchSongsFromAssets(context: Context): ArrayList<String> {
        return getListOfFilesFromAsset(SOUND_DIRECTORY, context)
    }

Attributions

All content for this solution is sourced from the original question on Stackoverflow.

The content on this page is licensed under the Attribution-ShareAlike 4.0 International (CC BY-SA 4.0) license.

Content TypeOriginal AuthorOriginal Content on Stackoverflow
QuestionMax LView Question on Stackoverflow
Solution 1 - AndroidKammaarView Answer on Stackoverflow
Solution 2 - Androidcafebabe1991View Answer on Stackoverflow
Solution 3 - AndroidKoushikView Answer on Stackoverflow
Solution 4 - AndroidMindRoasterMirView Answer on Stackoverflow
Solution 5 - AndroidvdshbView Answer on Stackoverflow
Solution 6 - AndroidabbasalimView Answer on Stackoverflow
Solution 7 - AndroidHitesh SahuView Answer on Stackoverflow