Android中如何复制整个文件夹

前言:

大家新年好!都初九了,哈哈。

之前做了一个文件管理器的app,然后没有复制文件夹的功能。经过我的一番努力和研究,终于做出了可以复制文件夹的方法。

简单的流程图:

Android中如何复制整个文件夹

效果图:

Android中如何复制整个文件夹                 Android中如何复制整个文件夹


我想大家关心的主要是代码了,哈哈

代码:

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.不能后台(即发前台通知反馈进度)。

本来自己做了一个界面,Android中如何复制整个文件夹

希望可以实时反馈进度,可以后台处理,可以知道很多信息。。。。

但是毕竟自己领悟能力有限,又没有人教,又不知道买什么书看,怎样去学.....

虽然买了本郭霖的《第一行代码》,但根本不够。。


以前,就去年,我学习很有冲劲,有一点点进步,我都好兴奋,实现了一些功能甚至会手舞足蹈,哈哈。

现在渐渐失去了这种感觉,由兴趣变成了一种压力,我不知道自己还会不会坚持下去。

去年买了书,以为学完应该可以找到一份程序猿的工作。。学习越久接触这个行业越深发现自己的想法真的太天真

好了,希望这个复制文件夹的方法能够帮到你,再见。