Android中如何复制整个文件夹
前言:
大家新年好!都初九了,哈哈。
之前做了一个文件管理器的app,然后没有复制文件夹的功能。经过我的一番努力和研究,终于做出了可以复制文件夹的方法。
简单的流程图:
效果图:
我想大家关心的主要是代码了,哈哈
代码:
package com.example.administrator.day2_15; import android.content.Context; import android.content.DialogInterface; import android.support.v7.app.AlertDialog; import android.util.Log; import android.widget.EditText; import android.widget.Toast; import java.io.File; import java.io.FileInputStream; import java.io.FileOutputStream; import java.io.IOException; import java.nio.channels.FileChannel; import java.util.ArrayList; import java.util.Collections; import java.util.List; /** * Created by Administrator on 2018/2/21 0021. */ public class CopyFileUtil { private static final String TAG = "CopyFileUtil"; private static File sourceFile; private static File targetFile; private static String fileName; public static void copyFileUsingFileChannels(File source, File dest) throws IOException { try (FileChannel inputChannel = new FileInputStream(source).getChannel(); FileChannel outputChannel = new FileOutputStream(dest).getChannel()) { outputChannel.transferFrom(inputChannel, 0, inputChannel.size()); } } public static void simpleCopy(final Context context, List<File> fileList, final String dest) { for (int i = 0; i < fileList.size(); i++) { sourceFile = fileList.get(i); //第一步先判断目标路径是否存在同名文件/文件夹 fileName = sourceFile.getName(); targetFile = new File(dest + "/" + fileName); if (targetFile.exists()) { //存在同名文件/文件夹 Log.d(TAG, "simpleCopy: 存在同名文件/文件夹" + fileName); //弹窗,让用户选择覆盖/重命名/跳过 //只能在点击事件中完成后续操作,不能通过改变标志位来延续后事...... AlertDialog.Builder builder = new AlertDialog.Builder(context); builder.setTitle("存在同名文件/文件夹"); builder.setMessage("名字:" + targetFile.getName()); builder.setPositiveButton("覆盖", new DialogInterface.OnClickListener() { @Override public void onClick(DialogInterface dialogInterface, int i) { sameCopy(context); } }); builder.setNegativeButton("重命名", new DialogInterface.OnClickListener() { @Override public void onClick(DialogInterface dialogInterface, int i) { final EditText editText = new EditText(context); AlertDialog.Builder renameBuilder = new AlertDialog.Builder(context); renameBuilder.setCancelable(false); renameBuilder.setTitle("重命名:"); renameBuilder.setView(editText); renameBuilder.setPositiveButton("确定", new DialogInterface.OnClickListener() { @Override public void onClick(DialogInterface dialogInterface, int i) { fileName = editText.getText().toString(); targetFile = new File(dest + "/" + fileName); sameCopy(context); } }); renameBuilder.show(); } }); builder.setNeutralButton("跳过", new DialogInterface.OnClickListener() { @Override public void onClick(DialogInterface dialogInterface, int i) { Log.d(TAG, "onClick: 用户选择了跳过"); Toast.makeText(context, "onClick: 用户选择了跳过", Toast.LENGTH_SHORT).show(); } }); builder.setCancelable(false); builder.show(); } else { //不存在同名文件/文件夹 //第二步 判断是文件还是文件夹 sameCopy(context); } } Log.d(TAG, "simpleCopy: 复制完毕"); } private static void sameCopy(Context context) { //第二步 判断是文件还是文件夹 if (sourceFile.isDirectory()) { //文件夹,将文件夹的所有内容加入subFileList if (targetFile.exists()) { //如果文件夹存在,用户选择的是覆盖,就没必要重新创建文件夹 List<File> subFileList = new ArrayList<>(); Collections.addAll(subFileList, sourceFile.listFiles()); simpleCopy(context, subFileList, targetFile.getAbsolutePath()); } else { if (targetFile.mkdir()) { List<File> subFileList = new ArrayList<>(); Collections.addAll(subFileList, sourceFile.listFiles()); simpleCopy(context, subFileList, targetFile.getAbsolutePath()); } else { Log.d(TAG, "simpleCopy: 创建文件夹失败!"); Log.d(TAG, "simpleCopy: 要么没有权限,要么目标路径有问题"); } } } else { //文件 - - 复制文件是耗时操作,需要在外环开子线程处理 new Thread(new Runnable() { @Override public void run() { try { copyFileUsingFileChannels(sourceFile, targetFile); } catch (IOException e) { e.printStackTrace(); } } }).start(); } } }
其中有个复制文件的方法copyFileUsingFileChannels,
点击打开链接,这个博客有完整的,不过他好像也是转载的。
我在安卓4.4的系统试过,大家如果发现有任何问题或者建议,请尽管提出。我也不知道会不会看到,哈哈。
自己的一些看法:
这个方法呢,很简陋,1.没有取消功能,2.没有实时反馈进度,3.不能后台(即发前台通知反馈进度)。
本来自己做了一个界面,
希望可以实时反馈进度,可以后台处理,可以知道很多信息。。。。
但是毕竟自己领悟能力有限,又没有人教,又不知道买什么书看,怎样去学.....
虽然买了本郭霖的《第一行代码》,但根本不够。。
以前,就去年,我学习很有冲劲,有一点点进步,我都好兴奋,实现了一些功能甚至会手舞足蹈,哈哈。
现在渐渐失去了这种感觉,由兴趣变成了一种压力,我不知道自己还会不会坚持下去。
去年买了书,以为学完应该可以找到一份程序猿的工作。。学习越久接触这个行业越深发现自己的想法真的太天真
好了,希望这个复制文件夹的方法能够帮到你,再见。