package com.csf.etlinger.common.utils; import java.io.BufferedInputStream; import java.io.BufferedOutputStream; 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.List; import org.apache.commons.lang.StringUtils; import org.apache.log4j.Logger; /** * 文件操作类 * @author mafenglei 2016-04-06 */ public class FileUtils { private static Logger logger = Logger.getLogger(FileUtils.class); private static final String pathError = "系统该路径不存在!"; /** * 创建文件 * @param fielPath * @return * @throws TblPccsException */ public static File createFile(String filePath) throws Exception{ File file = null; file = new File(filePath); return file; } /** * 单个文件复制 * @param sourceFile 源文件夹路径 * @param targetFile 目标文件夹路径 * @throws TblPccsException */ public static void moveFile(File sourceFile,File targetFile) throws Exception{ FileInputStream fi = null; FileOutputStream fo = null; FileChannel in = null; FileChannel out = null; try{ fi = new FileInputStream(sourceFile); fo = new FileOutputStream(targetFile); in = fi.getChannel(); out = fo.getChannel(); /**连接2个文件通道,从in通道读取,写入到out通道*/ in.transferTo(0, in.size(), out); }catch (IOException e) { e.printStackTrace(); logger.error(e.getMessage()); }finally{ try { fi.close(); fo.close(); in.close(); out.close(); } catch (IOException e) { e.printStackTrace(); logger.error(e.getMessage()); } } } /** * 把一个目录下的所有文件复制到另一个目录下 * @param sourceFile * @param targetFile * @throws TblPccsException */ public static void moveFolder(String sourcePath,String targetPath) throws Exception{ try{ /**拷贝文件是否存在*/ if(StringUtils.isBlank(sourcePath)){ logger.info(sourcePath+pathError); return; } /**备份路径*/ File targetFile = createFile(targetPath); if(!targetFile.exists()){ targetFile.mkdirs();//创建文件夹 logger.info("目录[" + targetPath + "]不存在,已创建"); } /**拷贝文件*/ File sourceFile = createFile(sourcePath); File[] fileList = sourceFile.listFiles();//目录下所有文件 if(fileList !=null && fileList.length >0){ for(File file : fileList){ if(!file.isFile()){ continue; } String name = file.getName(); if(name.endsWith("zip")){ continue; } String backFilePath = targetFile.getAbsolutePath()+File.separator+name; File backFile = createFile(backFilePath); moveFile(file,backFile); } }else{ logger.info(sourcePath+"该路径下没有文件 备份终止"); return; } }catch(Exception e){ e.printStackTrace(); logger.error(e.getMessage()); } } /** * 把一个目录下的部分文件移动到另一目录下 * @param original 源文件路径 * @param copy 目标文件路径 * @param number 复制的文件个数 */ public static void startMove(String original,String copy,int number){ try{ File targetFile = FileUtils.createFile(copy); if(!targetFile.exists()){ targetFile.mkdirs(); logger.info("目录[" + targetFile + "]不存在,已创建"); } //待删除的文件 List<String> prepDelFile = new ArrayList<>(); File file = new File(original); int count = 0; if(file.exists()){ File [] files = file.listFiles(); if(files.length > 0){ for(int i=0 ; i < files.length ; i ++){ count ++; String prefectFileName = original + File.separator + files[i].getName(); String copyPath = copy + File.separator + files[i].getName(); /* 文件复制 **/ FileUtils.singleFileReplication(prefectFileName,copyPath); //放入待删除内存 prepDelFile.add(prefectFileName); //平分文件 if(count == number){ break; } } }else{ logger.info("目录 [" +original+ "] 下 没有文件"); } }else{ logger.info("源文件目录[" +original +"] 不存在!"); } logger.info("目录 【" +original +"】下 "+number+"个文件已成功复制到 【" + copy + " 】目录下" ); /* 文件删除 **/ for(int i=0 ; i < prepDelFile.size() ; i ++){ FileUtils.deleteOneFile(prepDelFile.get(i));//文件删除 } logger.info("【" +original+ "】目录下"+number+" 原文件 已成功删除!"); }catch(Exception e){ logger.error(e); e.printStackTrace(); } } /** * 单个文件复制 * @param fatherPath 源文件路径 * @param copyPath 复制文件路径 * @throws IOException */ public static void singleFileReplication(String fatherPath,String copyPath) { try{ //读 FileInputStream fis = new FileInputStream(fatherPath); BufferedInputStream bufis = new BufferedInputStream(fis); //写 FileOutputStream fos = new FileOutputStream(copyPath); BufferedOutputStream bufos = new BufferedOutputStream(fos); int len = 0; while ((len = bufis.read()) != -1) { bufos.write(len); } bufis.close(); bufos.close(); }catch(Exception e){ logger.error(e.getMessage()); e.printStackTrace(); } } /** * 文件夹下指定文件复制 * @param sourcePath * @param targetPath * @param startStr 文件名以开头的字符串 * @throws TblPccsException */ public void moveAppointFile(String sourcePath,String targetPath,String startStr) throws Exception{ try{ /**拷贝文件是否存在*/ if(StringUtils.isBlank(sourcePath)){ logger.info(sourcePath+pathError); return; } /**备份文件夹*/ File targetFile = createFile(targetPath); if(!targetFile.exists()){ targetFile.mkdirs(); logger.info("目录[" + targetPath + "]不存在,已创建"); } /**拷贝文件*/ File sourceFile = createFile(sourcePath); File[] fileList = sourceFile.listFiles(); if(fileList!=null && fileList.length > 0){ for(File file : fileList){ if(!file.isFile()){ continue; } /**指定文件*/ String fileName = file.getName(); if(fileName.startsWith(startStr)){ String backFilePath = targetFile.getAbsolutePath()+File.separator+file.getName(); File backFile = createFile(backFilePath); moveFile(file, backFile); } } }else{ logger.info(sourcePath+"该路径下没有文件"); return; } }catch(Exception e){ e.printStackTrace(); logger.error(e.getMessage()); } } /** * 删除指定一个文件 * @param file * @throws TblPccsException */ public static void delFile(File file) throws Exception{ if(file.exists()){ file.delete(); }else{ logger.info(file.getName()+"不存在!"); } } /** * 删除动作 * @param path */ public static void deleteAll(String path){ try{ FileUtils.deleteFiles(path);//文件删除 Thread.sleep(1000*2); FileUtils.delete(path); //文件夹删除 }catch(Exception e){ logger.error(e); e.printStackTrace(); } } /** * 删除指定目录 * @param path */ public static void delete(String path){ File file = new File(path); if(file.exists()){ file.delete(); logger.info("指定目录 " + path + "已成功删除"); } } /** * 删除指定的一个文件 * @param fileName */ public static void deleteOneFile(String fileName){ File file = new File(fileName); if(file.exists()){ file.delete(); }else{ logger.info("指定文件 【" +file +"】不存在,无法删除"); } } /** * 删除指定目录下的所有文件 * @param delPath */ public static void deleteFiles(String delPath){ File file = new File(delPath); if(file.exists()){ File [] files = file.listFiles(); if(files != null || files.length > 0){ for(int i =0; i<files.length; i ++){ if(files[i].isDirectory()){ deleteFiles(delPath+File.separator+files[i].getName()); } files[i].delete(); logger.info( delPath + File.separator + files[i] + "文件成功删除"); } }else{ logger.info(delPath + "该目录下没有文件 ,终止删除操作"); } }else{ logger.info(delPath + "目录不存在, 终止删除操作"); } } // @Test public static void main(String[] agrs){ // deleteFiles("C:\Users\fenglei.ma\Desktop\数据读取\test1"); delete("C:\Users\fenglei.ma\Desktop\数据读取\test1"); // String sourcePath = "C:\Users\fenglei.ma\Desktop\数据读取\test"; // String targetPath = "C:\Users\fenglei.ma\Desktop\数据读取\test1"; // try { // moveFolder(sourcePath,targetPath); // System.out.println("运行结束"); // } catch (Exception e) { // // TODO Auto-generated catch block // e.printStackTrace(); // } } }