使用AssetManager.list列出子目录中的资产

我的应用程序有一个资产目录,其中我已经倾倒了一大堆我需要在运行时加载的文本文件。

我有一个目录充满了特定types的资产(即“资产/子目录”),我想加载这个目录中的所有文件,一次一个。

我有这样的代码:

AssetManager assetMgr = getAssets(); String[] assetsIWant = assetMgr.list("subdir"); for(String asset: assetsIWant) { doAssetyThing(asset); } 

我已经尝试了不同版本的参数assetMgr.list(),并没有得到任何地方。

如果我使用“/”,我得到一个包含“assets”目录的列表和一些随机的其他项目(例如META_INF)。 如果我通过任何其他string(如“assets”或“assets /”或“/ assets”或“/ assets /”或“mysubdir”或“/ mysubdir”或“assets / mysubdir”或…)返回一个空数组。

不幸的是,这些文件是相当不连贯的。

有没有人知道这个list()参数的正确公式是什么?

传递一个空的string似乎为我工作。 当我执行以下操作时,我得到我资产目录中的文件列表:

 AssetManager aMan = appContext.getAssets(); String[] filelist = aMan.list(""); 

我已经使用下面的代码列出assets / myFolder /中的文件名:

 String[] fileNames =getAssets().list("myFolder"); for(String name:fileNames){ System.out.println(name); } 

请注意,方法列表中的参数不包含“/”。

我不知道它为什么这样工作,但当我列出"/" ,我得到根级别的东西,而不是我的"assets"目录中的东西。 实际上我没有办法在短时间内尝试正确列出我的资产文件夹。

我使用的解决方法是在我的"assets"目录中创build一个"subdir" "assets"目录。 我把所有我想访问的资源放在这个"subdir" ,然后:

String[] assetsIWant = assetMgr.list("subdir");

我不知道为什么"/""assets"目录本身列为其中的一个文件,但是在给listpath时不需要指定"assets"目录。 也许别人知道,但我希望这个提示将帮助你。

当您需要在层次结构使用中更深入地访问文件夹时

 String[] fileNames =getAssets().list("myFolder"+File.separator+"mysubfolder"); 

而不是“/”里面的string,这将给你一个空的string数组作为结果。

围绕这个主题有很多类似的问题,我怀疑你正在使用库项目中的assets文件夹。 如果您尝试访问Android上的库项目中的资产,您将获得空白内容和您在此描述的确切症状

从android“项目”文档

来源: http : //developer.android.com/tools/projects/index.html

图书馆项目不能包含原始资产

这些工具不支持在库项目中使用原始资产文件(保存在资产/目录中)。 应用程序使用的任何资产资源必须存储在应用程序项目本身的资产/目录中。 但是,保存在res /目录中的资源文件是受支持的。

如果是这样的话,答案是你应该只包括你的应用程序项目的资产文件夹中的原始资产,而不是任何标记为库的项目(你可以通过右键单击你的项目并select属性,selectAndroid条目在左边,看看是库checkbox)

假设你已经设置了这个文件夹: Assets->SubDir1 。 你在Subdir1类似A.txtB.txtC.txt 。 所以从项目的目录,它将是Assets/SubDir1/A.txt

考虑到这一点,访问该文件的方式类似于你正在做的事情,增加一件事情。 这一点是在你的doAssetyThing函数。 即使您在.list("");中进行了"SubDir1"的过滤,也必须将SubDir1目录置于其前面.list("");

例:

  AssetManager am = getResources().getAssets(); String [] list = am.list("SubDir1"); for (String s:list) { doAssetyThing("SubDir1/" + s); //I use this next line as the start of copying a pdf from one location //to another. I wanted to give you a real function in use. InputStream inStream = am.open("SubDir1/" + s); //more code } 

我希望这是明确的,帮助你!

我使用以下两种方法来确保给定资产存在:

  protected boolean hasAsset(String id) { return hasAsset(id,""); } protected boolean hasAsset(String id, String dir) { int idx = id.indexOf('/'); if (idx > 0 && idx < id.length() - 1) { if (dir.length() > 0) { dir = dir + "/" + id.substring(0,idx); } else dir = id.substring(0,idx); return hasAsset(id.substring(idx + 1), dir); } try { return Arrays.asList(context.getAssets().list(dir)).contains(id); } catch (IOException e) { e.printStackTrace(); return false; } } 

这个解决scheme似乎适用于我:从资产目录的一个子目录中保存你想要访问的每个文件的副本。 使用相同的约定。 即list("subdirectory")

它不会读取资产文件夹中的文件,而是读取其子目录中的所有“已复制”文件。 奇怪的!! 但作品!

出于某种原因,没有列出空目录。

至less,根据我的经验,他们没有列出。

也就是说,如果资产区域中有一些dir / d1 / f1和some-dir / d2,并且列表(“some-dir”),则不会列出d2。