我的问题不是How to make a copy of a File in Android,我的问题是它无法复制的原因。
我的应用程序下载文件后尝试将其复制到另一个文件夹(最终用户可以将文件保存在多个文件夹中,这就是为什么我下载一次并复制到其余文件夹)。我有源文件路径,如:
/storage/emulated/0/MyAppFolder/FolderCreatedByUser1/theFile.pdf
我正在尝试将其复制到
/存储/模拟/ 0 / MyAppFolder / FolderCreatedByUser2 /
使用此代码(Robert Nekic改进的代码):
public static boolean copyFile(File src, File[] dst) {
boolean result = true;
if (src.exists()) {
String srcName = src.getName();
for (File file : dst) {
String to = file.getPath();
try {
File destination = new File(to, srcName);
if (destination.createNewFile()) {
FileChannel srcChnl = new FileInputStream(src).getChannel();
FileChannel dstChnl = new FileOutputStream(destination).getChannel();
dstChnl.transferFrom(srcChnl, 0, srcChnl.size());
srcChnl.close();
dstChnl.close();
} else {
result = false;
System.out.println("Unable to create destination " + destination.getPath());
}
} catch (Exception e) {
result = false;
System.out.println(e.getMessage());
break;
}
}
} else {
result = false;
System.out.println("File " + src.getPath() + " doesn't exist.");
}
return result;
}
该文件存在,但在将其复制到命运文件时仍然会出现错误,如:
/storage/emulated/0/MyAppFolder/FolderCreatedByUser2/theFile.pdf:open failed:ENOENT(没有这样的文件或目录)
尝试打开src文件和/或目标文件时,两个流都失败了:
FileChannel srcChnl = new FileInputStream(src).getChannel();
FileChannel dstChnl = new FileOutputStream(destination).getChannel();
授予写入权限。目标文件夹是在文件下载之前创建的,如果目录未创建,则用户无法选择目的地。
答案 0 :(得分:0)
destination = new File(to, srcName);
创建一个新的File实例,但不创建底层文件。您可以通过选中destination.exists()
进行验证。我相信你所需要的只是:
destination = new File(to, srcName);
destination.createNewFile();
此外,您的src
路径字符串操作和代码的前半部分中的内容似乎是不必要的,可能会引入一个错误,可以通过更简洁的方式解决:
public static boolean copyFile(File src, File[] dst) {
boolean result = true;
if (src.exists()) {
String srcName = src.getName();
for (File file : dst) {
String to = file.getPath();
try {
File destination = new File(to, srcName);
if (destination.createNewFile()) {
FileChannel srcChnl = new FileInputStream(src).getChannel();
FileChannel dstChnl = new FileOutputStream(destination).getChannel();
dstChnl.transferFrom(srcChnl, 0, srcChnl.size());
srcChnl.close();
dstChnl.close();
} else {
result = false;
System.out.println("Unable to create destination " + destination.getPath());
}
} catch (Exception e) {
result = false;
System.out.println(e.getMessage());
break;
}
}
} else {
result = false;
System.out.println("File " + src.getPath() + " doesn't exist.");
}
return result;
}