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

And*_*sky 43 java android

我的应用程序有一个资产目录,我在其中转储了一堆我需要在运行时加载的文本文件.

我有一个目录充满了特定类型的资产(即"assets/subdir"),我想加载这个目录中的所有文件,一次一个.

我有这样的代码:


AssetManager assetMgr = getAssets();

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

for(String asset: assetsIWant) {
  doAssetyThing(asset);
}
Run Code Online (Sandbox Code Playgroud)

我已经尝试了大量不同版本的参数到assetMgr.list()并且没有到达任何地方.

如果我使用"/",我会返回一个包含"assets"目录的列表,以及一些随机的其他项目(例如META_INF).如果我传递任何其他字符串(如"assets"或"assets /"或"/ assets"或"/ assets /"或"mysubdir"或"/ mysubdir"或"assets/mysubdir"或...)那么我得到回一个空数组.

遗憾的是,文件相当不连贯.

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

小智 33

传递一个空字符串似乎对我有用.当我执行以下操作时,我得到资产目录中的文件列表:

AssetManager aMan = appContext.getAssets();
String[] filelist = aMan.list("");
Run Code Online (Sandbox Code Playgroud)


Dav*_*-mu 27

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

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

请注意,方法列表中的参数不包含"/".


小智 13

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

String[] fileNames =getAssets().list("myFolder"+File.separator+"mysubfolder");
Run Code Online (Sandbox Code Playgroud)

而不是String中的"/",这将给你一个空的String数组作为结果.


Hos*_*ile 12

我不确定为什么它会这样工作,但是当我列出时"/",我会得到根级别的东西,而不是我"assets"目录中的东西.我实际上找不到在我花费的时间内正确列出我的资产文件夹的方法.

我正在使用的解决方法是"subdir"在我的"assets"目录中创建一个目录.我把我想要访问的所有资产放在这里"subdir",并且:

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

我不知道为什么"/""assets"目录本身列为其中一个文件,但是"assets"在提供list路径时不必指定目录.也许其他人都知道,但我希望无论如何这个提示会帮助你.

  • "/"指向应用的根文件夹."" 指向当前(资产)文件夹. (3认同)

Mat*_*att 6

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

来自android"项目"文档

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

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

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

如果是这种情况,答案是您应该只将Raw资源包含在应用程序项目的assets文件夹中而不是任何标记为库的项目中(您可以通过右键单击项目并选择属性来检查这一点,选择android条目在左侧,看看是库复选框)