无法将文件复制到文件夹

时间:2017-02-08 01:51:35

标签: android file copy storage

任务:我想将所选文件从A文件夹复制到B文件夹。两个文件夹都在外部存储器中。

问题:它运行得很好,但是,在某些时候它只是停止复制文件。例如,如果我想复制500个文件,它将只复制110个文件。另外,我注意到我无法复制视频文件,只能用于图片。

代码

我用来复制文件的方法:

  private static void makeFileCopy(File source, File dest) throws IOException {
    InputStream is = null;
    OutputStream os = null;
    try {
        is = new FileInputStream(source);
        os = new FileOutputStream(dest);
        byte[] buffer = new byte[1024];
        int length;
        while ((length = is.read(buffer)) > 0) {
            os.write(buffer, 0, length);
        }
    }finally {
        try {
            if (is != null)
                is.close();
            if (os != null)
                os.close();
        }catch (IOException ex) {
            ex.printStackTrace();
        }
    }
}

还有一个:

 public static void copyFileList(Context context, List<MediaFile> contentList, File mediaFolder) {
    if (contentList != null) {
        ContentValues values=new ContentValues();
        for (int index=0;index<contentList.size();index++) {
            MediaFile mediaFile=contentList.get(index);
            File file = new File(mediaFolder, mediaFile.mediaFile().getName());
            boolean isVideo=mediaFile.getType()== MediaFile.Type.VIDEO;
            if (!file.exists()) {
                try {
                    if (!file.createNewFile()) {
                        continue;
                    }
                    FileUtils.makeFileCopy(mediaFile.getRealFile().getAbsoluteFile(), file);

                } catch (IOException ex) {
                    ex.printStackTrace();
                    continue;
                }

                if (isVideo) {
                    values.put(MediaStore.Video.VideoColumns.DATA, file.getAbsolutePath());
                    context.getContentResolver().insert(MediaStore.Video.Media.EXTERNAL_CONTENT_URI, values);
                } else {
                    values.put(MediaStore.Images.ImageColumns.DATA, file.getAbsolutePath());
                    context.getContentResolver().insert(MediaStore.Images.Media.EXTERNAL_CONTENT_URI, values);
                }
                values.clear();
            }
        }
    }
}

谢谢!

1 个答案:

答案 0 :(得分:0)

最后,我已经解决了这个问题。这是我犯过的非常愚蠢的错误。

解决方案:我想制作一份我已经在目标文件夹中的文件副本,并通过检查if (!file.exists())它没有通过。所以,我想出了以下代码:

public static void copyFileList(Context context, List<MediaFile> contentList, File mediaFolder) {
    if (contentList != null) {
        ContentValues values=new ContentValues();
        for (int index=0;index<contentList.size();index++) {
            MediaFile mediaFile=contentList.get(index);
            String fileName=mediaFile.mediaFile().getName();

            boolean isVideo=mediaFile.getType()== MediaFile.Type.VIDEO;
            File file = new File(mediaFolder, fileName);
            //let a user to decide whether to create a copy of already existing files
            if(!file.exists()) {
                file=new File(mediaFolder,uniqueNameFor(fileName));
            }

            if(!file.exists()) {
                try {
                    FileUtils.makeFileCopy(mediaFile.mediaFile().getAbsoluteFile(), file);
                } catch (IOException ex) {
                    ex.printStackTrace();
                    continue;
                }

                if (isVideo) {
                    values.put(MediaStore.Video.VideoColumns.DATA, file.getAbsolutePath());
                    values.put(MediaStore.Video.VideoColumns.MIME_TYPE,mediaFile.getMimeType());
                    context.getContentResolver().insert(MediaStore.Video.Media.EXTERNAL_CONTENT_URI, values);
                } else {
                    values.put(MediaStore.Images.ImageColumns.DATA, file.getAbsolutePath());
                    values.put(MediaStore.Images.ImageColumns.MIME_TYPE,mediaFile.getMimeType());
                    context.getContentResolver().insert(MediaStore.Images.Media.EXTERNAL_CONTENT_URI, values);
                }

            }
            values.clear();
        }
    }
}

只需创建文件的唯一名称。

我也改变了复制方法:

   private static void makeFileCopy(File source, File dest) throws IOException {
    FileChannel inputChannel = null;
    FileChannel outputChannel = null;
    try {
        inputChannel = new FileInputStream(source).getChannel();
        outputChannel = new FileOutputStream(dest).getChannel();
        outputChannel.transferFrom(inputChannel, 0, inputChannel.size());
    } finally {
        try {
            if (inputChannel != null)
                inputChannel.close();
            if (outputChannel != null)
                outputChannel.close();
        }catch (IOException ex) {
            ex.printStackTrace();
        }
    }
}

使用频道比使用以前的方法快一点。 查看4种如何复制文件的方法here

谢谢你的帮助!