【问题标题】:List all files and folders (also Subfolders) in Assets Directory in my App and check if an asset is a file or a folder在我的应用程序中列出资产目录中的所有文件和文件夹(也包括子文件夹),并检查资产是文件还是文件夹
【发布时间】:2018-09-08 04:51:56
【问题描述】:

我想检查我的 Android 应用的 Assets 目录中的资产是文件还是目录。

我已经尝试了互联网上任何地方可用的所有解决方案,包括 StackOverflow。

大多数解决方案都使用

File myFile = new File(path);

然后检查 myFile.isDirectory(); 要么 myFile.isFile();

但只有当我的文件和目录位于Assets 目录之外的任何其他位置时,它才有效。

任何建议都将受到高度赞赏。

【问题讨论】:

  • 那么:您遇到了什么问题?只是说 new File("") 不会测试它是目录还是文件,你需要做更多的事情
  • 一些解决方案告诉检查 myFile.isDirectory() 或 myFile.isFile() 会有所帮助,但它没有,因为它只有在它是非 Assests 路径时才有效。谢谢
  • 正常情况下应该可以的。
  • @stultuske 但他们没有工作我花了 6 个多小时尝试他们。是目录();和 isFile();总是返回假。他们接受不形成---路径---。正如我所说,它们仅适用于非 Assests 路径。原因是 Assests 不是文件系统的一部分,正如一些解决方案所建议的那样。谢谢
  • 问题是,您的 100% 工作解决方案存在一些重大缺陷。它现在可能有效,但谁知道以后会添加哪些文件/目录会产生误报?

标签: java android file directory assets


【解决方案1】:

这是我的问题的解决方案,我发现 100% 列出所有目录和文件,甚至子目录和子目录中的文件。它也适用于多个级别。

注意:就我而言

  1. 文件名有一个 .在他们之中。即 .htm .txt 等
  2. Directorynames 没有任何 .在他们里面。

注意:关于--路径--

  1. 获取 Assets 根文件夹中的所有文件和目录

    String path = ""; // assets

  2. 或获取子文件夹中的文件和目录,使用其名称作为路径

    String path = "html"; // <<-- assets/html

    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);
                    if(path.equals("")) {
                        listAssetFiles2(file); // <<-- To get subdirectory files and directories list and check 
    
                    }else{
                        listAssetFiles2(path+"/"+file); // <<-- For Multiple level subdirectories
                    }
                }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();
    }
    

    }

谢谢

【讨论】:

  • 这不能 100% 工作。可以创建没有扩展名的文件。另外:文件名可以有一个“。”在他们里面。
  • @stultuske 它对我有用 100%。我有一个文件夹,其中有 .htm 扩展名文件和目录,其中包含 .htm 和 . (点)在他们。也请再次阅读您的评论。你可能想说“目录名可以有一个'。'在他们之中” 。请重新检查您的评论谢谢
  • 是的,你是对的,但它提供了基本的想法,并且可以根据每个程序员的要求进行修改。这就是在我给定的问题中对我有用的方法。谢谢。
  • 这是一个糟糕的解决方案,因为它假设一个点与否。并且也可以有没有点的文件名。
  • 与其让名称中的点决定应该发生什么,不如检查它是文件还是目录。通过尝试打开文件/目录的 InputStream 来创建自己的 isDirectory(name) 函数。如果你成功了,它就是一个文件。如果您遇到异常,则它是一个目录。完成后不要忘记关闭流。
【解决方案2】:

与其让名称中的点决定应该发生什么,不如检查它是文件还是目录。通过尝试为文件/目录打开 InputStream 来创建自己的 isDirectory(name) 函数。如果你成功了,它就是一个文件。如果您遇到异常,则它是一个目录。完成后不要忘记关闭流。

【讨论】:

  • 如果您有空闲时间,请提供一些咖啡。谢谢
  • 如果您将文件放入资产中,那么迟早您将在您的应用程序中使用它们。使用/读取它们的唯一方法是为其打开一个 InputStream。您将拥有该代码。用它!只需几行代码即可实现isDirectory(name)
  • 我已经尝试了很多变化,但对我没有用。请尽可能提供代码示例。谢谢。无论如何我会再试一次。
猜你喜欢
  • 2012-07-13
  • 2018-01-29
  • 2012-03-10
  • 1970-01-01
  • 2019-02-22
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多