2010-10-03 5 views
8

Estoy intentando crear una carpeta y varios subdirectorios dentro de ella en la tarjeta SD ... Entonces quiero transferir los archivos que he almacenado en/res/raw a esa carpeta ... Además, quiero que esto solo suceder una vez, la primera vez que se ejecuta el programa. Me doy cuenta de que esto es ridículamente abierto, y que estoy pidiendo mucho ... pero cualquier ayuda sería muy apreciada.Android: ¿Cómo crear un directorio en la tarjeta SD y copiar archivos de/res/raw a él?

Respuesta

9

Esto copiará todos los archivos en la subcarpeta "clip" de la carpeta de activos .apk a la subcarpeta "clip" de la carpeta de su aplicación en la tarjeta SD:

String extStorageDirectory = Environment.getExternalStorageDirectory().toString(); 
    String basepath = extStorageDirectory + "/name of your app folder on the SD card"; 
//... 

// in onCreate 
File clipartdir = new File(basepath + "/clipart/"); 
     if (!clipartdir.exists()) { 
      clipartdir.mkdirs(); 
      copyClipart();  
     } 

private void copyClipart() { 
     AssetManager assetManager = getResources().getAssets(); 
     String[] files = null; 
     try { 
      files = assetManager.list("clipart"); 
     } catch (Exception e) { 
      Log.e("read clipart ERROR", e.toString()); 
      e.printStackTrace(); 
     } 
     for(int i=0; i<files.length; i++) { 
      InputStream in = null; 
      OutputStream out = null; 
      try { 
       in = assetManager.open("clipart/" + files[i]); 
       out = new FileOutputStream(basepath + "/clipart/" + files[i]); 
       copyFile(in, out); 
       in.close(); 
       in = null; 
       out.flush(); 
       out.close(); 
       out = null; 
      } catch(Exception e) { 
       Log.e("copy clipart ERROR", e.toString()); 
       e.printStackTrace(); 
      }  
     } 
    } 
    private 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); 
     } 
    } 
+0

dónde viene este código tienen que ser para asegurarse de que sólo ocurre una vez, en la instalación, y luego eliminar los archivos de la APK? – joon

+0

@joon: puede usar [link] (http://developer.android.com/reference/android/content/SharedPreferences.html) para guardar un valor booleano y asegurarse de que solo ocurra una vez. Por cierto, no puede eliminar archivos de apk. @ Ver más: [link] (http://developer.android.com/guide/topics/resources/providing-resources.html) – Justin

0

que experimentaron un problema similar cuando se usa mkdirs(), sin embargo debido a la ejecución del comando:

mkdir uno/dos

un error en Linux, entonces el método subse http://download.oracle.com/javase/1.4.2/docs/api/java/io/File.html#mkdirs() quently también falla. ¿Supongo que esto significa que no hay forma de usar mkdirs en Android? Mi (probablemente bastante hacky) solución alternativa era crear cada directorio necesaria por separado:

String extStorageDirectory = Environment.getExternalStorageDirectory().toString(); 
new File(extStorageDirectory + "/one/").mkdirs(); 
new File(extStorageDirectory + "/one/two/).mkdirs(); 
+0

[File.mkDirs() ] (http://developer.android.com/reference/java/io/File.html#mkdirs%28%29) funciona. Lo probé en Android 2.1 (API nivel 7) – Mudassir

Cuestiones relacionadas