Борьба с папками активов

Я боролся с простым списком каталогов активов. У меня есть следующая структура (грубо говоря):

-dirA
--data.xml
--AudioSUBdir
---some files here
--VideoSUBdir
---some files here
-dirB
--data.xml
--AudioSUBdir
---some files here
-test    
--SUBtestDir

Все, что мне нужно, — это список родительского каталога ресурсов (то есть dirA, dirB и test; затем я прочитаю файлы data.xml и на основе этого что-то сделаю с содержимым подкаталогов).

Я думал, что получить нужные две строки будет легко:

try {
   String[] fileNames;
   fileNames = getAssets().list("");
   for(String name:fileNames){
      // process it, e.g. write it out }
} catch (IOException e) {}

Однако то, что я получаю, это что-то вроде AudioSUBdir, dirA, dirB, VideoSUBdir, webkit (вообще нет проклятого webkit!) Кажется, он делает несколько странных вещей одновременно:

  • он игнорирует структуру каталогов, т.е. читает даже подкаталоги, где не должен
  • он волшебным образом отображает каталог webkit, хотя во всей папке проекта его нет
  • он полностью игнорирует каталог "test"

Итак, моих вопросов два (с половиной)

  1. как мне получить только корневые папки (позже я хочу проверить их на наличие файла folder/data.xml, который будет обработан, и приложение сделает все, что должно)
  2. любое объяснение происходящего. Теоретически я мог бы иметь дело с тем фактом, что он даже записывает подкаталоги, хотя они мне не нужны. Я мог бы даже смириться с тем фактом, что он игнорирует тестовую папку (возможно, потому, что они пусты? - Ну, пустые, содержащие только подкаталог, а не файл, но в любом случае...) Но откуда, черт возьми, берется папка webkit? Это как-то «постгенерируется» процессом сборки apk?
  3. У меня такое ощущение, что все подпапки на самом деле свернуты в один корень. Означает ли это, что файлы с одинаковыми именами будут конфликтовать в процессе сборки?

person Malis    schedule 08.11.2012    source источник
comment
Вы пытались вручную проверить структуру каталогов с помощью adb shell? Это дает вам оболочку командной строки Linux для структуры каталогов устройств. Вы можете от cd до /data/data/<project-name>/assets просматривать файлы напрямую.   -  person Code-Apprentice    schedule 09.11.2012
comment
Как и Code-Guru, я не вижу ничего плохого в вашем коде.   -  person Vincent Mimoun-Prat    schedule 09.11.2012
comment
Ну, я работаю в Windows, поэтому я, конечно же, вручную проверил структуру каталогов (сгенерированную Eclipse). Но он создает нормальные каталоги, как и ожидалось. Тем не менее, листинг каталога делает то, что я описал выше.   -  person Malis    schedule 09.11.2012
comment
У AssetManager мозг мертв. Ваше наблюдение верно. Единственный способ обойти это, который я нашел, - написать свой собственный рекурсивный поиск. Если вам это нужно (это легко сделать), дайте мне знать, и я накопаю. Кстати, ресурсы во время выполнения являются виртуальными и объединены с вашим каталогом ресурсов, поэтому вы увидите то, что вы туда не поместили.   -  person Simon    schedule 09.11.2012
comment
Рекурсивный поиск в активах будет оценен по достоинству, так как я не уверен, как сделать что-то рекурсивное на чем-то, что кажется выровненным из любой структуры :(   -  person Malis    schedule 09.11.2012
comment
Я разместил это как ответ, так как не могу сделать это в комментарии;) Кстати, он не сглажен. Пройдитесь по коду и проверьте массив строк files.   -  person Simon    schedule 09.11.2012
comment
@ Саймон, я не вижу твоего ответа. Но в любом случае, я, кажется, могу решить свою конкретную проблему прямо сейчас. Но я до сих пор не совсем понимаю, как работают getAssets и list. Почему они отображают подкаталоги (но отображают файлы в этих каталогах только в том случае, если подкаталог указан в аргументе списка). Любая подсказка, где я мог бы узнать, чего ожидать от getAssets, не играя в угадайку с результатами?   -  person Malis    schedule 09.11.2012


Ответы (1)


Что касается 1-го (и основного) вопроса моего вопроса, я думаю, что понял это.

try {
   String[] fileNames;
   fileNames = MyAudioGuideApplication.this.getAssets().list("");
   for(String name:fileNames){
       if (Arrays.asList(getResources().getAssets().list(name)).contains("data.xml"))
        process.the.file.here
   }
} catch (IOException e) {}

Я до сих пор не уверен, как именно работает getAssets, но, по крайней мере, получается следующее:

  • папки игнорируются, если они не содержат файлов
  • вывод сортируется по алфавиту независимо от структуры
  • при вызове из корневой папки, т. е. ...list(""), выводит список даже подкаталогов

Может быть, это может помочь кому-то, кто борется, как я.

person Malis    schedule 09.11.2012