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