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

时间:2010-09-02 21:19:23

标签: java android

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

我有一个充满特定类型资产的目录(即“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()参数的正确公式是什么吗?

9 个答案:

答案 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->SubDir1Subdir1中的内容有A.txtB.txtC.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。