我的应用程序有一个资产目录,我在其中转储了一堆我需要在运行时加载的文本文件。
我有一个充满特定类型资产的目录(即“assets / subdir”),我想加载此目录中的所有文件,一次一个。
我有这样的代码:
AssetManager assetMgr = getAssets();
String[] assetsIWant = assetMgr.list("subdir");
for(String asset: assetsIWant) {
doAssetyThing(asset);
}
我已经尝试了大量不同版本的参数到assetMgr.list()并且没有到达任何地方。
如果我使用“/”,我会返回一个包含“assets”目录的列表,以及一些随机的其他项目(例如META_INF)。如果我传递任何其他字符串(如“assets”或“assets /”或“/ assets”或“/ assets /”或“mysubdir”或“/ mysubdir”或“assets / mysubdir”或...)那么我得到回一个空数组。
遗憾的是,文档相当不连贯。
有人知道list()参数的正确公式是什么吗?
答案 0 :(得分:33)
传递空字符串似乎对我有用。当我执行以下操作时,我得到资产目录中的文件列表:
AssetManager aMan = appContext.getAssets();
String[] filelist = aMan.list("");
答案 1 :(得分:27)
我使用以下代码列出assets / myFolder /中的文件名:
String[] fileNames =getAssets().list("myFolder");
for(String name:fileNames){
System.out.println(name);
}
请注意,方法列表中的参数不包含“/".
答案 2 :(得分:13)
如果您需要访问层次结构中较深层的文件夹,请使用
String[] fileNames =getAssets().list("myFolder"+File.separator+"mysubfolder");
而不是String中的“/”,这将为您提供一个空的String数组。
答案 3 :(得分:12)
我不确定为什么它会以这种方式工作,但是当我列出"/"
时,我会获得根级别的东西,而不是我的"assets"
目录中的东西。我实际上发现在我花费的时间内没有办法正确列出我的资产文件夹。
我正在使用的解决方法是在"subdir"
目录中创建一个"assets"
目录。我在此"subdir"
中放置了我想要访问的所有资产,并执行:
String[] assetsIWant = assetMgr.list("subdir");
我不知道为什么"/"
将"assets"
目录本身列为其中一个文件,但在授予{{1}时您不必指定"assets"
目录} 一条路径。也许其他人都知道,但我希望这个提示能帮到你。
答案 4 :(得分:6)
围绕这个主题有很多类似的问题,我怀疑你正在使用库项目中的assets文件夹。如果您尝试访问Android上的库项目中的资产,您将获得空内容和您在此处描述的确切症状
来自android“项目”文档
来源:http://developer.android.com/tools/projects/index.html
图书馆项目不能包含原始资产
这些工具不支持使用原始资产文件(保存在assets /目录中) 图书馆项目。应用程序使用的任何资产资源必须是 存储在应用程序项目本身的assets /目录中。 但是,支持保存在res /目录中的资源文件。
如果是这种情况,答案是您应该只在标记为库的任何项目中将Raw资产包含在应用程序项目的资产文件夹中 NOT (您可以通过右键单击来检查这一点你的项目和选择属性,选择左侧的android条目,然后查看is library复选框)
答案 5 :(得分:3)
假设您已设置此文件夹:Assets->SubDir1
。 Subdir1
中的内容有A.txt
,B.txt
,C.txt
。所以从Project的目录中,它将是Assets/SubDir1/A.txt
。
考虑到这一点,访问该文件的方式类似于您正在做的事情,添加一件事。有一点在你的doAssetyThing
函数中。即使您在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
}
我希望这很清楚并帮助你!
答案 6 :(得分:2)
我使用以下两种方法来确保存在给定资产:
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;
}
}
答案 7 :(得分:1)
此解决方案似乎对我有用:
从资产目录的子目录中保留您要访问的每个文件的副本。
使用相同的约定。即list("subdirectory")
它不读取assets文件夹中的文件,而是读取其子目录中的所有“复制”文件。 奇怪的!!但是有效!
答案 8 :(得分:1)
由于某种原因,未列出空目录。
至少,根据我的经验,他们没有列出。
也就是说,如果资产区域中有some-dir / d1 / f1和some-dir / d2,并且列出(“some-dir”),则不会列出d2。