任务:我想将所选文件从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();
}
}
}
}
谢谢!
答案 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。
谢谢你的帮助!