实现文件复制、剪切、删除操作 Java

package FileOperation;

import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;

/*
 * Java实现文件复制、剪切、删除操作
 * 文件指文件或文件夹
 * 文件分割符统一用"//"
 */

public class FileOperateDemo {
   
    /**
     * 复制文件或文件夹
     * @param srcPath
     * @param destDir 目标文件所在的目录
     * @return
     */
    public static boolean copyGeneralFile(String srcPath, String destDir) {
        boolean flag = false;
        File file = new File(srcPath);
        if(!file.exists()) {
            System.out.println("源文件或源文件夹不存在!");
            return false;
        }
        if(file.isFile()) {    //源文件
            System.out.println("下面进行文件复制!");
            flag = copyFile(srcPath, destDir);
        }
        else if(file.isDirectory()) {
            System.out.println("下面进行文件夹复制!");
            flag = copyDirectory(srcPath, destDir);
        }
       
        return flag;
    }
   
    /**
     * 复制文件
     *
     * @param srcPath
     *            源文件绝对路径
     * @param destDir
     *                 目标文件所在目录
     * @return boolean
     */
    private static boolean copyFile(String srcPath, String destDir) {
        boolean flag = false;

        File srcFile = new File(srcPath);
        if (!srcFile.exists()) { // 源文件不存在
            System.out.println("源文件不存在");
            return false;
        }
        //获取待复制文件的文件名
        String fileName = srcPath.substring(srcPath.lastIndexOf(File.separator));
        String destPath = destDir + fileName;
        if (destPath.equals(srcPath)) { // 源文件路径和目标文件路径重复
            System.out.println("源文件路径和目标文件路径重复!");
            return false;
        }
        File destFile = new File(destPath);
        if(destFile.exists() && destFile.isFile()) {    //该路径下已经有一个同名文件
            System.out.println("目标目录下已有同名文件!");
            return false;
        }
       
        File destFileDir = new File(destDir);
        destFileDir.mkdirs();
        try {
            FileInputStream fis = new FileInputStream(srcPath);
            FileOutputStream fos = new FileOutputStream(destFile);
            byte[] buf = new byte[1024];
            int c;
            while ((c = fis.read(buf)) != -1) {
                fos.write(buf, 0, c);
            }
            fis.close();
            fos.close();

            flag = true;
        } catch (IOException e) {
            //
        }
       
        if(flag) {
            System.out.println("复制文件成功!");
        }

        return flag;
    }
   
    /**
     *
     * @param srcPath    源文件夹路径
     * @param destPath    目标文件夹所在目录
     * @return
     */
    private static boolean copyDirectory(String srcPath, String destDir) {
        System.out.println("复制文件夹开始!");
        boolean flag = false;

        File srcFile = new File(srcPath);
        if (!srcFile.exists()) { // 源文件夹不存在
            System.out.println("源文件夹不存在");
            return false;
        }
        //获得待复制的文件夹的名字,比如待复制的文件夹为"E://dir"则获取的名字为"dir"
        String dirName = getDirName(srcPath);
        //目标文件夹的完整路径
        String destPath = destDir + File.separator + dirName;
//        System.out.println("目标文件夹的完整路径为:" + destPath);
       
        if(destPath.equals(srcPath)) {
            System.out.println("目标文件夹与源文件夹重复");
            return false;
        }
        File destDirFile = new File(destPath);
        if(destDirFile.exists()) {    //目标位置有一个同名文件夹
            System.out.println("目标位置已有同名文件夹!");
            return false;
        }
        destDirFile.mkdirs();    //生成目录
       
        File[] fileList = srcFile.listFiles();    //获取源文件夹下的子文件和子文件夹
        if(fileList.length==0) {    //如果源文件夹为空目录则直接设置flag为true,这一步非常隐蔽,debug了很久
            flag = true;
        }
        else {
            for(File temp: fileList) {
                if(temp.isFile()) {    //文件
                    flag = copyFile(temp.getAbsolutePath(), destPath);
                }
                else if(temp.isDirectory()) {    //文件夹
                    flag = copyDirectory(temp.getAbsolutePath(), destPath);
                }
                if(!flag) {
                    break;
                }
            }
        }
       
        if(flag) {
            System.out.println("复制文件夹成功!");
        }
       
        return flag;
    }
   
    /**
     * 获取待复制文件夹的文件夹名
     * @param dir
     * @return String
     */
    private static String getDirName(String dir) {
        if(dir.endsWith(File.separator)) {    //如果文件夹路径以"//"结尾,则先去除末尾的"//"
            dir = dir.substring(0, dir.lastIndexOf(File.separator));
        }
        return dir.substring(dir.lastIndexOf(File.separator)+1);
    }

    /**
     * 删除文件或文件夹
     *
     * @param path
     *            待删除的文件的绝对路径
     * @return boolean
     */
    public static boolean deleteGeneralFile(String path) {
        boolean flag = false;

        File file = new File(path);
        if (!file.exists()) { // 文件不存在
            System.out.println("要删除的文件不存在!");
        }

        if (file.isDirectory()) { // 如果是目录,则单独处理
            flag = deleteDirectory(file.getAbsolutePath());
        } else if (file.isFile()) {
            flag = deleteFile(file);
        }

        if (flag) {
            System.out.println("删除文件或文件夹成功!");
        }

        return flag;
    }

    /**
     * 删除文件
     * @param file
     * @return boolean
     */
    private static boolean deleteFile(File file) {
        return file.delete();
    }

    /**
     * 删除目录及其下面的所有子文件和子文件夹,注意一个目录下如果还有其他文件或文件夹
     * 则直接调用delete方法是不行的,必须待其子文件和子文件夹完全删除了才能够调用delete
     * @param path
     *            path为该目录的路径
     */
    private static boolean deleteDirectory(String path) {
        boolean flag = true;
        File dirFile = new File(path);
        if (!dirFile.isDirectory()) {
            return flag;
        }
        File[] files = dirFile.listFiles();
        for (File file : files) { // 删除该文件夹下的文件和文件夹
            // Delete file.
            if (file.isFile()) {
                flag = deleteFile(file);
            } else if (file.isDirectory()) {// Delete folder
                flag = deleteDirectory(file.getAbsolutePath());
            }
            if (!flag) { // 只要有一个失败就立刻不再继续
                break;
            }
        }
        flag = dirFile.delete(); // 删除空目录
        return flag;
    }
   
    /**
     * 由上面方法延伸出剪切方法:复制+删除
     * @param  destDir 同上
     */
    public static boolean cutGeneralFile(String srcPath, String destDir) {
        if(!copyGeneralFile(srcPath, destDir)) {
            System.out.println("复制失败导致剪切失败!");
            return false;
        }
        if(!deleteGeneralFile(srcPath)) {
            System.out.println("删除源文件(文件夹)失败导致剪切失败!");
            return false;
        }
       
        System.out.println("剪切成功!");
        return true;
    }

    public static void main(String[] args) {
        copyGeneralFile("E://Assemble.txt", "E://New.txt");    //复制文件
        copyGeneralFile("E://hello", "E://world");            //复制文件夹
        deleteGeneralFile("E://onlinestockdb.sql");            //删除文件
        deleteGeneralFile("E://woman");                        //删除文件夹
        cutGeneralFile("E://hello", "E://world");            //剪切文件夹
        cutGeneralFile("E://Difficult.java", "E://Cow//");    //剪切文件
    }

}

你可能感兴趣的:(实现文件复制、剪切、删除操作 Java)