Java 将资产文件夹子目录复制到外部存储器中的特定文件夹
我正在使用Android上的ProgramAB,它要求我通过在其中创建/bots/目录,将aiml文件从assets文件夹复制到外部存储器。这是我从教android中聊天机器人的教程中获取的代码(代码中调用的其他函数与目录复制无关) 我尝试过其他的解决办法,但都不管用Java 将资产文件夹子目录复制到外部存储器中的特定文件夹,java,android,android-assets,Java,Android,Android Assets,我正在使用Android上的ProgramAB,它要求我通过在其中创建/bots/目录,将aiml文件从assets文件夹复制到外部存储器。这是我从教android中聊天机器人的教程中获取的代码(代码中调用的其他函数与目录复制无关) 我尝试过其他的解决办法,但都不管用 //checking SD card availablility boolean a = isSDCARDAvailable(); //receiving the assets from th
//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真的很陌生,我甚至无法检查复制是否真的发生了。代码不执行任务是因为您声明的问题吗?您应该告诉我们什么可行,什么不可行。使用log语句和toast来查看发生了什么。做一些基本的调试。实际上我正在使用VisualStudioEmulator,所以调试变得更像是一种开销,因为adb链接问题等等。将定制代码以尽快供公众参考。:)这是完美的工作!实际上,我也关注过同一个博客:)
/**
* 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);
}
}