2013-06-07 2 views
9

Я хотел бы скопировать довольно большой каталог из папки с ресурсами моего приложения в папку с данными при первом запуске приложения. Как это сделать? Я уже пробовал несколько примеров, но ничего не работало, поэтому у меня ничего нет. Моя цель - Android 4.2.копировать каталог из активов в папку данных

Спасибо, Yannik

+0

Зачем вам это делать? Если я не ошибаюсь, данные и папка с данными будут работать до тех пор, пока приложение будет установлено. – gunar

+0

Это может быть полезно для вас, ребята http://stackoverflow.com/questions/4447477/android-how-to-copy-files-from-assets-folder-to-sdcard/25988337#25988337 – DropAndTrap

ответ

19

попробовать этот код экземпляра приложения (вы должны написать класс в манифесте): Этот код копирует содержание активов/файлов папки в папку кэш-памяти приложения (вы можете разместить другой путь в функции copyAssetFolder()). Только когда приложение запущено в первый раз

import java.io.File; 
import java.io.FileOutputStream; 
import java.io.IOException; 
import java.io.InputStream; 
import java.io.OutputStream; 

import android.app.Application; 
import android.content.Context; 
import android.content.res.AssetManager; 
import android.preference.PreferenceManager; 

public class MyApplication extends Application { 
    private static Context s_sharedContext; 

    @Override 
    public void onCreate() { 
     super.onCreate(); 
     if (!PreferenceManager.getDefaultSharedPreferences(
       getApplicationContext()) 
      .getBoolean("installed", false)) { 
      PreferenceManager.getDefaultSharedPreferences(
        getApplicationContext()) 
       .edit().putBoolean("installed", true).commit(); 

      copyAssetFolder(getAssets(), "files", 
        "/data/data/com.example.appname/files"); 
     } 
    } 

    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); 
     } 
    } 

} 
+0

Спасибо, но я хотел поместить его в папку с данными, потому что я хотел бы запустить скрипт, который находится внутри папки. – yanniks

+0

В какой папке вы имеете в виду? Можете ли вы написать абсолютный путь? – matreshkin

+0

например /data/data/com.example.appname/ – yanniks

Смежные вопросы