使用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"
目录本身列为其中的一个文件,但是在给list
path时不需要指定"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.txt
, B.txt
, C.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。