web-dev-qa-db-fra.com

Liste des fichiers dans le dossier assets et ses sous-dossiers

J'ai des dossiers avec des fichiers HTML dans le dossier "assets" de mon projet Android. Je dois afficher ces fichiers HTML à partir de sous-dossiers d’actifs dans une liste. J'ai déjà écrit du code pour faire cette liste.

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);
    }
});
35
Max L
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; 
} 

Appelez listAssetFiles avec le nom du dossier racine de votre dossier d'actif.

    listAssetFiles("root_folder_name_in_assets");

Si le dossier racine est le dossier de ressources, appelez-le avec 

    listAssetFiles("");    
74
Kammaar

essayez ceci cela fonctionnera dans votre cas 

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

L'extrait ci-dessus affiche le contenu de la racine de l'actif.

Par exemple ... si ci-dessous est la structure de l'actif ..

assets
 |__Dir1
 |__Dir2
 |__File1

L'extrait de code sera .... Dir1 Dir2 File1

Si vous avez besoin du contenu du répertoire Dir1

Passez le nom du répertoire dans la fonction de liste.

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

Voici une solution à mon problème que j'ai découvert en travaillant à 100% en listant tous les répertoires et fichiers, même les sous-répertoires et les fichiers des sous-répertoires. 

Note: dans mon cas

  1. Les noms de fichiers ont un. en eux. c'est-à-dire .htm .txt, etc.
  2. Les noms de répertoires n'en avaient pas. en eux.

    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
    

Merci

1
MindRoasterMir

J'espère que cette aide:

le code suivant va copier tout le dossier, son contenu et le contenu du sous-dossier vers l'emplacement sdcard

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

Basé sur la réponse de @Kammaar. Ce code kotlin analyse l’arborescence des fichiers à la recherche des feuilles:

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
}
0
vadim_shb