package org.jeecg.modules.iot.util; import java.io.File; import java.io.FileInputStream; import java.io.FileOutputStream; import java.io.FileWriter; import java.io.IOException; import java.io.InputStream; import java.io.PrintWriter; import java.io.*; public class FileUtil { // 验证字符串是否为正确路径名的正则表达式 private static String matches = "[A-Za-z]:\\\\[^:?\"><*]*"; // 通过 sPath.matches(matches) 方法的返回值判断是否正确 // sPath 为路径字符串 private static boolean flag = false; private static File file; /** * 删除指定目录或文件(无论存在与否) * * @param deletePath String 目录或文件路径 如 c:/fqf 或 c:/fd.txt * @return boolean */ public static boolean deleteFolder(String deletePath) { flag = false; if (deletePath.matches(matches)) { file = new File(deletePath); if (!file.exists()) {// 判断目录或文件是否存在 return flag; // 不存在返回 false } else { if (file.isFile()) {// 判断是否为文件 return deleteFile(deletePath);// 为文件时调用删除文件方法 } else { return deleteDirectory(deletePath);// 为目录时调用删除目录方法 } } } else { System.out.println("要传入正确路径!"); return false; } } /** * 删除指定文件 * * @param filePath String 文件路径 如 c:/fd.txt * @return boolean */ public static boolean deleteFile(String filePath) { flag = false; file = new File(filePath); if (file.isFile() && file.exists()) {// 路径为文件且不为空则进行删除 file.delete();// 文件删除 flag = true; } return flag; } /** * 删除目录(文件夹)以及目录下的文件 * * @param dirPath String 目录路径 如 c:/fqf * @return boolean */ public static boolean deleteDirectory(String dirPath) { // 如果sPath不以文件分隔符结尾,自动添加文件分隔符 if (!dirPath.endsWith(File.separator)) { dirPath = dirPath + File.separator; } File dirFile = new File(dirPath); // 如果dir对应的文件不存在,或者不是一个目录,则退出 if (!dirFile.exists() || !dirFile.isDirectory()) { return false; } flag = true; File[] files = dirFile.listFiles();// 获得传入路径下的所有文件 for (int i = 0; i < files.length; i++) {// 循环遍历删除文件夹下的所有文件(包括子目录) if (files[i].isFile()) {// 删除子文件 flag = deleteFile(files[i].getAbsolutePath()); System.out.println(files[i].getAbsolutePath() + " 删除成功"); if (!flag) break;// 如果删除失败,则跳出 } else {// 运用递归,删除子目录 flag = deleteDirectory(files[i].getAbsolutePath()); if (!flag) break;// 如果删除失败,则跳出 } } if (!flag) return false; if (dirFile.delete()) {// 删除当前目录 return true; } else { return false; } } /** * 创建单个文件 * * @param filePath String 文件路径 如 c:/fqf.txt * @return boolean */ public static boolean createFile(String filePath) { File file = new File(filePath); if (file.exists()) {// 判断文件是否存在 System.out.println("目标文件已存在" + filePath); return false; } if (filePath.endsWith(File.separator)) {// 判断文件是否为目录 System.out.println("目标文件不能为目录!"); return false; } if (!file.getParentFile().exists()) {// 判断目标文件所在的目录是否存在 // 如果目标文件所在的文件夹不存在,则创建父文件夹 System.out.println("目标文件所在目录不存在,准备创建它!"); if (!file.getParentFile().mkdirs()) {// 判断创建目录是否成功 System.out.println("创建目标文件所在的目录失败!"); return false; } } try { if (file.createNewFile()) {// 创建目标文件 System.out.println("创建文件成功:" + filePath); return true; } else { System.out.println("创建文件失败!"); return false; } } catch (IOException e) {// 捕获异常 e.printStackTrace(); System.out.println("创建文件失败!" + e.getMessage()); return false; } } /** * 新建文件 * * @param filePathAndName String 文件路径及名称 如c:/fqf.txt * @param fileContent String 文件内容 * @return void */ public static void createFile(String filePathAndName, String fileContent) { try { String filePath = filePathAndName; filePath = filePath.toString(); File myFilePath = new File(filePath); if (!myFilePath.exists()) { myFilePath.createNewFile(); } FileWriter resultFile = new FileWriter(myFilePath); PrintWriter myFile = new PrintWriter(resultFile); String strContent = fileContent; myFile.println(strContent); resultFile.close(); System.out.println("新建文件成功" + filePathAndName); } catch (Exception e) { System.out.println("新建文件操作出错"); e.printStackTrace(); } } /** * 查询目录是否存在(文件夹) * * @param catalogueName String 目录路径 如 c:/fqf * @return boolean */ public static boolean queryCatalogue(String catalogueName) { File dir = new File(catalogueName); if (dir.exists()) {// 判断目录是否存在 System.out.println("创建目录失败,目标目录已存在!"); return false; } return true; } /** * 创建目录(文件夹) * * @param destDirName String 目录路径 如 c:/fqf * @return boolean */ public static boolean createDir(String destDirName) { File dir = new File(destDirName); if (dir.exists()) {// 判断目录是否存在 System.out.println("创建目录失败,目标目录已存在!"); return false; } if (!destDirName.endsWith(File.separator)) {// 结尾是否以"/"结束 destDirName = destDirName + File.separator; } if (dir.mkdirs()) {// 创建目标目录 System.out.println("创建目录成功!" + destDirName); return true; } else { System.out.println("创建目录失败!"); return false; } } /** * 复制单个文件 * * @param oldPath String 原文件路径 如:c:/fqf.txt * @param newPath String 复制后路径 如:f:/fqf.txt * @return boolean */ public static void copyFile(String oldPath, String newPath) { try { int bytesum = 0; int byteread = 0; File oldfile = new File(oldPath); if (oldfile.exists()) { //文件存在时 InputStream inStream = new FileInputStream(oldPath); //读入原文件 FileOutputStream fs = new FileOutputStream(newPath); byte[] buffer = new byte[1444]; int length; while ((byteread = inStream.read(buffer)) != -1) { bytesum += byteread; //字节数 文件大小 System.out.println("文件大小:" + bytesum + "字节"); fs.write(buffer, 0, byteread); } inStream.close(); fs.close(); } } catch (Exception e) { System.out.println("复制单个文件操作出错"); e.printStackTrace(); } } /** * 复制单个文件 * * @param source String 原文件路径 如:c:/fqf.txt * @param dest String 复制后路径 如:f:/fqf.txt * @return boolean */ private static void copyFile2(String source, String dest) { try { File in = new File(source); File out = new File(dest); FileInputStream inFile = new FileInputStream(in); FileOutputStream outFile = new FileOutputStream(out); byte[] buffer = new byte[1024]; int i = 0; while ((i = inFile.read(buffer)) != -1) { outFile.write(buffer, 0, i); }//end while inFile.close(); outFile.close(); }//end try catch (Exception e) { }//end catch }//end copyFile /** * 复制整个文件夹内容 * * @param oldPath String 原文件路径 如:c:/fqf * @param newPath String 复制后路径 如:f:/fqf/ff * @return boolean */ public static void copyFolder(String oldPath, String newPath) { try { (new File(newPath)).mkdirs(); //如果文件夹不存在 则建立新文件夹 File a = new File(oldPath); String[] file = a.list(); File temp = null; for (int i = 0; i < file.length; i++) { if (oldPath.endsWith(File.separator)) { temp = new File(oldPath + file[i]); } else { temp = new File(oldPath + File.separator + file[i]); } if (temp.isFile()) { FileInputStream input = new FileInputStream(temp); FileOutputStream output = new FileOutputStream(newPath + "/" + (temp.getName()).toString()); byte[] b = new byte[1024 * 5]; int len; while ((len = input.read(b)) != -1) { output.write(b, 0, len); } output.flush(); output.close(); input.close(); } if (temp.isDirectory()) {//如果是子文件夹 copyFolder(oldPath + "/" + file[i], newPath + "/" + file[i]); } } System.out.println("复制整个文件夹内容成功,文件总数:" + file.length); } catch (Exception e) { System.out.println("复制整个文件夹内容操作出错"); e.printStackTrace(); } } /** * 移动文件到指定目录 * * @param oldPath String 如:c:/fqf.txt * @param newPath String 如:d:/fqf.txt */ public static void moveFile(String oldPath, String newPath) { copyFile(oldPath, newPath); deleteFolder(oldPath); } /** * 移动文件夹到指定目录 * * @param oldPath String 如:c:/fqf.txt * @param newPath String 如:d:/fqf.txt */ public static void moveFolder(String oldPath, String newPath) { copyFolder(oldPath, newPath); deleteFolder(oldPath); } /** * 创建临时文件 * * @param prefix String 文件名称前缀 如 temp2478577457.txt * @param suffix String 文件类型 如 .txt /.docx * @return string */ public static String createTempFile(String prefix, String suffix, String dirName) { File tempFile = null; if (dirName == null) {// 目录如果为空 try { tempFile = File.createTempFile(prefix, suffix);// 在默认文件夹下创建临时文件 return tempFile.getCanonicalPath();// 返回临时文件的路径 } catch (IOException e) {// 捕获异常 e.printStackTrace(); System.out.println("创建临时文件失败:" + e.getMessage()); return null; } } else { // 指定目录存在 File dir = new File(dirName);// 创建目录 if (!dir.exists()) { // 如果目录不存在则创建目录 if (FileUtil.createDir(dirName)) { System.out.println("创建临时文件失败,不能创建临时文件所在的目录!"); return null; } } try { tempFile = File.createTempFile(prefix, suffix, dir);// 在指定目录下创建临时文件 return tempFile.getCanonicalPath();// 返回临时文件的路径 } catch (IOException e) {// 捕获异常 e.printStackTrace(); System.out.println("创建临时文件失败!" + e.getMessage()); return null; } } } }