List of files in assets folder and its subfolders

后端 未结 6 1044
甜味超标
甜味超标 2020-11-27 15:00

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

相关标签:
6条回答
  • 2020-11-27 15:38

    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
    }
    
    0 讨论(0)
  • 2020-11-27 15:44

    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");
    
    0 讨论(0)
  • 2020-11-27 15:49

    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();
     }
    
    0 讨论(0)
  • 2020-11-27 15:55

    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

    0 讨论(0)
  • 2020-11-27 15:56

    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;
    }
    
    0 讨论(0)
  • 2020-11-27 16:00
    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("");    
    
    0 讨论(0)
提交回复
热议问题