【问题标题】:Copying assets folder subdirectories to specific folder in external storage将资产文件夹子目录复制到外部存储中的特定文件夹
【发布时间】:2017-05-08 12:08:44
【问题描述】:

我正在使用带有 Android 的 ProgramAB,这需要我通过在其中创建 /bots/ 目录将 aiml 文件从资产文件夹复制到外部存储。这是我从 this 教程中获取的代码,该教程教授了 android 中的聊天机器人(此代码中调用的其他函数与目录复制无关)。

我尝试了其他解决方案,但没有任何效果。

   //checking SD card availablility
        boolean a = isSDCARDAvailable();
        //receiving the assets from the app directory
        AssetManager assets = getResources().getAssets();
        File jayDir = new File(Environment.getExternalStorageDirectory().toString() + "/hari/bots/Hari");
        boolean b = jayDir.mkdirs();
        if (jayDir.exists()) {
            //Reading the file
            try {
                for (String dir : assets.list("Hari")) {
                    File subdir = new File(jayDir.getPath() + "/" + dir);
                    boolean subdir_check = subdir.mkdirs();
                    for (String file : assets.list("Hari/" + dir)) {
                        File f = new File(jayDir.getPath() + "/" + dir + "/" + file);
                        if (f.exists()) {
                            continue;
                        }
                        InputStream in = null;
                        OutputStream out = null;
                        in = assets.open("Hari/" + dir + "/" + file);
                        out = new FileOutputStream(jayDir.getPath() + "/" + dir + "/" + file);
                        //copy file from assets to the mobile's SD card or any secondary memory
                        copyFile(in, out);
                        in.close();
                        in = null;
                        out.flush();
                        out.close();
                        out = null;
                    }
                }
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
        //get the working directory
        MagicStrings.root_path = Environment.getExternalStorageDirectory().toString() + "/hari";
        System.out.println("Working Directory = " + MagicStrings.root_path);
        AIMLProcessor.extension =  new PCAIMLProcessorExtension();
        //Assign the AIML files to bot for processing  
        bot = new Bot("Hari", MagicStrings.root_path, "chat");
        chat = new Chat(bot);
        String[] args = null;
        mainFunction(args);

【问题讨论】:

  • boolean b = jayDir.mkdirs();。如果目录尚不存在,您应该只调用 mkdirs。如果 mkdirs 返回 false,您应该向用户显示敬酒。并返回。现在你盲目地继续。请修改您的代码。
  • @greenapps 我真的是 android 新手,我什至无法检查复制是否真的发生了。代码是否因为您陈述的问题而没有执行任务?
  • 您应该告诉我们哪些有效,哪些无效。使用日志语句和 toast 看看会发生什么。做一些基本的调试。
  • 实际上我正在使用 Visual Studio 模拟器,因此调试变得更像是一种开销,因为 adb 链接问题等等。将尽快定制代码以供公众参考。 :)

标签: java android android-assets


【解决方案1】:

这段代码运行良好。 这是整个tutorial

/**
 * Copy the asset at the specified path to this app's data directory. If the
 * asset is a directory, its contents are also copied.
 * 
 * @param path
 * Path to asset, relative to app's assets directory.
 */
private void copyAsset(String path) {
  AssetManager manager = getAssets();

  // If we have a directory, we make it and recurse. If a file, we copy its
  // contents.
  try {
    String[] contents = manager.list(path);

    // The documentation suggests that list throws an IOException, but doesn't
    // say under what conditions. It'd be nice if it did so when the path was
    // to a file. That doesn't appear to be the case. If the returned array is
    // null or has 0 length, we assume the path is to a file. This means empty
    // directories will get turned into files.
    if (contents == null || contents.length == 0)
      throw new IOException();

    // Make the directory.
    File dir = new File(getExternalFilesDir(null), path);
    dir.mkdirs();

    // Recurse on the contents.
    for (String entry : contents) {
      copyAsset(path + "/" + entry);
    }
  } catch (IOException e) {
    copyFileAsset(path);
  }
}

/**
 * Copy the asset file specified by path to app's data directory. Assumes
 * parent directories have already been created.
 * 
 * @param path
 * Path to asset, relative to app's assets directory.
 */
private void copyFileAsset(String path) {
  File file = new File(getExternalFilesDir(null), path);
  try {
    InputStream in = getAssets().open(path);
    OutputStream out = new FileOutputStream(file);
    byte[] buffer = new byte[1024];
    int read = in.read(buffer);
    while (read != -1) {
      out.write(buffer, 0, read);
      read = in.read(buffer);
    }
    out.close();
    in.close();
  } catch (IOException e) {
    Log.e(e);
  }
}

【讨论】:

  • 这是完美的工作!实际上我关注的是同一个博客:)
猜你喜欢
  • 1970-01-01
  • 2013-06-03
  • 1970-01-01
  • 2012-01-14
  • 2014-07-25
  • 1970-01-01
  • 1970-01-01
  • 2018-09-10
  • 1970-01-01
相关资源
最近更新 更多