2010-08-28 13 views
26

Mi aplicación tiene archivos .txt en subdirectorios en la carpeta de activos. Lee esos archivos .txt y los pone en una vista de texto. Está funcionando bien y no hay problemas.¿Buscar existencia de archivos en la carpeta androids assets?

¿Debería preocuparme si los archivos en la carpeta de activos son eliminados por el usuario o si faltan? Si esto pudiera suceder, mi aplicación obtendría un error porque el archivo no estaría allí cuando intentara leerlo en la transmisión.

¿Existe una necesidad de que compruebe la existencia de un archivo de activos antes de leerlo o el administrador de activos se ocupa de todo? También me preguntaba si existe la posibilidad de que un usuario elimine y pueda eliminar el archivo de activos.

Como digo, todo funciona bien sin que yo inserte el código para verificar la existencia del archivo. Me preguntaba si las personas usan la declaración .exists() cada vez que van a leer en una transmisión desde activos.

Respuesta

4

Sí y No.

Un usuario normal no sería capaz de eliminarlos, pero un usuario de un teléfono raíces que no saben lo que están haciendo ... eso es una situación diferente.

Si me preguntas, el código adicional no es necesario. Además, si intenta abrir un archivo que no existe, obtendrá una excepción en algún momento, atrapa eso y mostrará un cuadro de diálogo si realmente desea .

+0

Gran! Gracias Chris.Tengo una transacción de "prueba/captura" en el código, pero me pregunto si un usuario podrá acceder a los activos. Oye, intenta decir, "Accede a los activos" cinco veces rápido. ¡Decir ah! – Allan

+1

Más que eso, la única manera de "eliminarlos" es reconstruir la .apk sin ellos, lo que también requiere resignarlo con un certificado diferente. Si se bloquea porque alguien hizo esto, lo merece más que eso. : p – hackbod

1

Creo que debería estar bien. Al tener una raíz en mi teléfono, no veo ninguna forma de eliminar los documentos sin eliminar la aplicación, ya que todo parece estar envuelto en el archivo .apk. Usted puede hacerlo, pero creo que debe estar rooteado o utilizar adb.

Yo personalmente rodearía cualquier lectura/escritura con un bloque try/catch de todos modos, solo para estar seguro.

+0

Muy bien Espiandev, muchas gracias por su respuesta. – Allan

21

si realmente desea comprobar si el archivo de la existencia:

AssetManager mg = getResources().getAssets(); 
InputStream is = null; 
try { 
    is = mg.open(pathInAssets); 
    //File exists so do something with it 
} catch (IOException ex) { 
    //file does not exist 
} finally { 
    if (is != null) { 
    is.close(); 
    } 
} 

Si el archivo se encuentra en assets/folder/file.ext, entonces pathInAssets habría "folder/file.ext"

+2

Si no falla, cierre la secuencia abierta. – Moss

+0

Bueno, no se está guardando como referencia, por lo que el inputstream devuelto se debe limpiar al final de la llamada al método de todos modos –

57

Usted puede estar preocupado de que el archivo se ha eliminado y el apk resignó

Puede verificar usando:

Arrays.asList(getResources().getAssets().list("")).contains("myFile") 
+1

Funciona cuando tienes nombres de archivos únicos, de lo contrario usa la solución de natronita. – IlyaEremin

+0

Estoy diseñando una aplicación genérica como una especie de plantilla, que puede contener o no algunos archivos incrustados. Esta solución funciona muy bien para mí, ¡gracias! :) –

+0

@IlyaEremin nombres de archivo no únicos. Tengo curiosidad por ver cómo funciona eso. – njzk2

5

Lo ideal es que, una vez creado el apk, nadie pueda eliminar ningún activo del mismo, pero si alguien lo descompila y recompila, es posible.

Aunque para otros escenarios también cuando un activo no está presente en apk en Runtime, podemos verificar la existencia del activo.

En nuestra aplicación, tenemos una provisión para crear aplicaciones usando gradle, ant y eclipse, y para cada mecanismo de compilación algunos de nuestros archivos de activos están empaquetados en apk y otros no, para identificar si hay algún archivo de activos presente en apk compilación actual en tiempo de ejecución,

hacemos esto de la siguiente manera:

private boolean isAssetExists(String pathInAssetsDir){ 
    AssetManager assetManager = AppContext.get().getResources().getAssets(); 
    InputStream inputStream = null; 
    try { 
     inputStream = assetManager.open(pathInAssetsDir); 
     if(null != inputStream) { 
      return true; 
     } 
    } catch(IOException e) { 
     e.printStackTrace(); 
    } finally { 
     try { 
      inputStream.close(); 
     } catch (IOException e) { 
      e.printStackTrace(); 
     } 
    } 
    return false; 
} 
Cuestiones relacionadas