无法在Android中复制文件

时间:2018-04-10 19:52:13

标签: java android

我的问题不是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();

授予写入权限。目标文件夹是在文件下载之前创建的,如果目录未创建,则用户无法选择目的地。

1 个答案:

答案 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;
}