2014-04-07 14 views
7

ho bisogno di utilizzare alcuni file nella mia app. Sono conservati nella cartella degli asset. Ho visto discussioni su SO, dove i file vengono copiati dalla cartella delle risorse, in/data/data/sulla memoria interna e quindi utilizzati. Ricevo il codice, ma quello che non ottengo è, qual è la necessità di copiare le risorse nella memoria interna? Se qualcuno ha esperienza con questo, aiuto!Android - Copiare i file dalla cartella di beni/dati/dati

+1

vedi [questa] (http://stackoverflow.com/questions/19218775/android-copy-assets-to-internal-storage) – user3355820

+0

@ user3355820 ho capito come si possa copiare attivi nella memoria interna o archiviazione esterna. Ottengo entrambi sono possibili, per esempio, ecco alcuni esempi di codice per la copia di file da risorsa per la memoria interna - http://stackoverflow.com/questions/15574983/copy-directory-from-assets-to-local-directory. Quello che non capisco è, perché uno vorrebbe farlo. Qual è il significato della copia delle risorse nell'archiviazione interna/esterna. – superuser

risposta

5

Prova questo: (utilizzare tutti e tre il suo metodo di lavoro per me e assegnare percorso di destinazione in "topath" oggetto stringa)

String toPath = "/data/data/" + getPackageName(); // Your application path 


    private static boolean copyAssetFolder(AssetManager assetManager, 
      String fromAssetPath, String toPath) { 
     try { 
      String[] files = assetManager.list(fromAssetPath); 
      new File(toPath).mkdirs(); 
      boolean res = true; 
      for (String file : files) 
       if (file.contains(".")) 
        res &= copyAsset(assetManager, 
          fromAssetPath + "/" + file, 
          toPath + "/" + file); 
       else 
        res &= copyAssetFolder(assetManager, 
          fromAssetPath + "/" + file, 
          toPath + "/" + file); 
      return res; 
     } catch (Exception e) { 
      e.printStackTrace(); 
      return false; 
     } 
    } 

    private static boolean copyAsset(AssetManager assetManager, 
      String fromAssetPath, String toPath) { 
     InputStream in = null; 
     OutputStream out = null; 
     try { 
      in = assetManager.open(fromAssetPath); 
      new File(toPath).createNewFile(); 
      out = new FileOutputStream(toPath); 
      copyFile(in, out); 
      in.close(); 
      in = null; 
      out.flush(); 
      out.close(); 
      out = null; 
      return true; 
     } catch(Exception e) { 
      e.printStackTrace(); 
      return false; 
     } 
    } 

    private static void copyFile(InputStream in, OutputStream out) throws IOException { 
     byte[] buffer = new byte[1024]; 
     int read; 
     while((read = in.read(buffer)) != -1){ 
      out.write(buffer, 0, read); 
     } 
    } 
+3

Giusta idea, ma non dovresti scrivere a fondo la directory/data (dato che è soggetta a modifiche) ma piuttosto scoprirla tramite l'API appropriata in fase di runtime. –

+0

Dipende dall'utente, mi è stata fornita una risposta per copiare la cartella delle risorse in qualche percorso ... e se hai letto nuovamente la domanda l'utente chiede "/ data/data" in modo chiaro. –

+0

@LavekushAgrawal questo codice copierà a ' "/ dati/data /" + getPackageName()' ... questo non è esattamente '/ dati/data /'. – ben75

1

Penso che non è possibile modificare/modificare i dati nella cartella di asset in fase di esecuzione o dopo l'installazione dell'applicazione. Così spostiamo i file nella cartella interna, quindi iniziamo a lavorarci sopra.

8

Uno dei motivi che appena spuntato per me è quando si utilizza il codice esistente C/C++ con NDK che richiede un percorso di un file e non si desidera modificare il codice.

Per esempio, sto usando una libreria C esistente che ha bisogno di alcuni file di dati e l'unica interfaccia esistente è un po ' "carico (char * path)" la funzione.

forse c'è in realtà un metodo migliore, ma non ho ancora trovato alcuna.

1
public final String path = "/data/data/com.aliserver.shop/databases/"; 
public final String Name = "store_db"; 

public void _copydatabase() throws IOException { 

     OutputStream myOutput = new FileOutputStream(path + Name); 
     byte[] buffer = new byte[1024]; 
     int length; 
     InputStream myInput = MyContext.getAssets().open("store_db"); 
     while ((length = myInput.read(buffer)) > 0) { 
      myOutput.write(buffer, 0, length); 
     } 
     myInput.close(); 
     myOutput.flush(); 
     myOutput.close(); 

    } 
+0

grazie :) mi ha salvato la giornata –

Problemi correlati