2011-04-13 18 views
9

Me gustaría obtener el tamaño de archivo de un archivo ubicado en el directorio de activos. Vi muchos ejemplos como¿Hay alguna forma de abrir un archivo como objeto de archivo desde la carpeta de activos de Android?

InputStream myInput = appContext.getAssets().open() 

Sé que puedo determinar tamaño de archivo por simple lectura InputStream en el ciclo pero estoy buscando una manera de hacerlo a través de File object.
Así que necesito un camino a los activos y eso es lo que no puedo determinar ... ¿Cómo conseguir ese camino?
También intentó obtener AssetFileDescriptor a través de appContext.getAssets().openFd() y openNonAssetFd(), pero no tuvo suerte - obtuvo FileNotFound o probablemente excepciones comprimidas.
Por cierto, esos métodos openFd están "bastante descritos" en developer.android.com.


lo hubiera intentado siguiente código:

file = new File(new URI("file:///android_asset/db/call3.db")); 
Log.i(APP_TAG, "File name: "+file.getName()); 
Log.i(APP_TAG, "File path: "+file.getPath()); 
Log.i(APP_TAG, "File length: "+file.length()); 
Log.i(APP_TAG, "File isFile: "+file.isFile()); 
Log.i(APP_TAG, "File exists: "+file.exists()); 

que da salida al registro:
04-13 12: 10: 03,413: INFO (6259): Nombre del archivo: call3.db
04-13 12: 10: 03.432: INFO (6259): Ruta del archivo: /android_asset/db/call3.db
04-13 12: 10: 03.444: INFO (6259): Longitud del archivo: 0
04-13 12: 10: 03.444 : INFO (6259): Archivo isFile: falso
04-13 12: 10: 03.444: INFO (6259): El archivo existe: falso

por supuesto, el tamaño del archivo no es 0 es 195 584 bytes.

Respuesta

5

¿Cómo conseguir ese camino?

No hay camino. Lo que estás buscando no es posible, lo siento.

+2

ok. y ¿qué pasa con appContext.getAssets(). openFd()/openNonAssetFd()? ¿Para qué sirve y por qué tampoco funciona? – Stan

+1

La respuesta más desgarradora, pero verdadera. –

2

No estoy seguro de si hay alguna forma de obtener un objeto File desde una carpeta de activos, pero para conocer la longitud de un archivo en una sola línea, puede usar el siguiente código.

AssetFileDescriptor afd = context.getAssets().openFd(fileName); 
long size = afd.getLength(); 
+4

openFd() fallará con el siguiente error en la mayoría de los casos, dado que los activos generalmente se comprimen antes de agregarse al APK: 'java.io.FileNotFoundException: este archivo no se puede abrir como un descriptor de archivo; probablemente esté comprimido'. Si puede cambiar el nombre de su archivo de activos para tener una de las extensiones no comprimibles (como mp3), entonces el archivo de activos no se comprimirá cuando se cree el APK y este método realmente funcionará. – Theo

+1

también puede agregar 'android {aaptOptions {noCompress" zip_nocompression "}}' y forzar aapt a no comprimir activos con su extensión personalizada –

Cuestiones relacionadas