Browse Source

sftp增加历史文件打包上传备份至服务器,本地清理功能

tl 6 months ago
parent
commit
962290b646
1 changed files with 137 additions and 0 deletions
  1. 137 0
      cpp-admin/src/main/java/com/cpp/web/utils/ZipUtil.java

+ 137 - 0
cpp-admin/src/main/java/com/cpp/web/utils/ZipUtil.java

@@ -0,0 +1,137 @@
+package com.cpp.web.utils;
+
+import lombok.extern.slf4j.Slf4j;
+
+import java.io.*;
+import java.util.zip.ZipEntry;
+import java.util.zip.ZipOutputStream;
+
+@Slf4j
+public class ZipUtil {
+
+    private static final int  BUFFER_SIZE = 2 * 1024;
+
+
+    /**
+     *
+     * @param path
+     * @param file
+     * @return
+     */
+    public static String zip(String path, String zipPath) {
+        FileOutputStream fos = null;
+        try {
+
+            fos = new FileOutputStream(new File(zipPath));
+            if (toZip(path, fos, true)) {
+                //压缩成功后删除目录
+                delFile(new File(path));
+                log.info("压缩成功,将【" + path + "]目录删除");
+            }
+
+            return zipPath;
+        } catch (FileNotFoundException e) {
+            e.printStackTrace();
+            return null;
+        }
+
+    }
+
+    //递归删除法
+    public static boolean delFile(File file) {
+        if (file.isDirectory()) {
+            File[] files = file.listFiles();
+            for (File f : files) {
+                delFile(f);
+            }
+        }
+        return file.delete();
+    }
+
+    public static Boolean toZip(String srcDir, OutputStream out, boolean KeepDirStructure) throws RuntimeException {
+
+        long start = System.currentTimeMillis();
+        ZipOutputStream zos = null;
+        try {
+            zos = new ZipOutputStream(out);
+            File sourceFile = new File(srcDir);
+            compress(sourceFile, zos, sourceFile.getName(), KeepDirStructure);
+            long end = System.currentTimeMillis();
+            log.info("前一日已上报文件压缩完成,耗时:" + (end - start) + " ms");
+            return true;
+        } catch (Exception e) {
+            log.info("已上报文件压缩错误!!!", e);
+            return false;
+        } finally {
+            if (zos != null) {
+                try {
+                    zos.close();
+                } catch (IOException e) {
+                    e.printStackTrace();
+                }
+            }
+        }
+
+    }
+
+    /**
+     * 递归压缩方法
+     *
+     * @param sourceFile       源文件
+     * @param zos              zip输出流
+     * @param name             压缩后的名称
+     * @param KeepDirStructure 是否保留原来的目录结构,true:保留目录结构;
+     *                         false:所有文件跑到压缩包根目录下(注意:不保留目录结构可能会出现同名文件,会压缩失败)
+     * @throws Exception
+     */
+    private static void compress(File sourceFile, ZipOutputStream zos, String name,
+                                 boolean KeepDirStructure) throws Exception {
+        byte[] buf = new byte[BUFFER_SIZE];
+        if (sourceFile.isFile()) {
+            // 向zip输出流中添加一个zip实体,构造器中name为zip实体的文件的名字
+            zos.putNextEntry(new ZipEntry(name));
+            // copy文件到zip输出流中
+            int len;
+            FileInputStream in = null;
+            try {
+                in = new FileInputStream(sourceFile);
+                while ((len = in.read(buf)) != -1) {
+                    zos.write(buf, 0, len);
+                }
+                // Complete the entry
+                zos.closeEntry();
+            } catch (Exception e) {
+                e.printStackTrace();
+            } finally {
+                if (in != null) {
+                    in.close();
+                }
+            }
+
+        } else {
+            File[] listFiles = sourceFile.listFiles();
+            if (listFiles == null || listFiles.length == 0) {
+                // 需要保留原来的文件结构时,需要对空文件夹进行处理
+                if (KeepDirStructure) {
+                    // 空文件夹的处理
+                    zos.putNextEntry(new ZipEntry(name + "/"));
+                    // 没有文件,不需要文件的copy
+                    zos.closeEntry();
+                }
+
+            } else {
+                for (File file : listFiles) {
+                    // 判断是否需要保留原来的文件结构
+                    if (KeepDirStructure) {
+                        // 注意:file.getName()前面需要带上父文件夹的名字加一斜杠,
+                        // 不然最后压缩包中就不能保留原来的文件结构,即:所有文件都跑到压缩包根目录下了
+                        compress(file, zos, name + "/" + file.getName(), KeepDirStructure);
+                    } else {
+                        compress(file, zos, file.getName(), KeepDirStructure);
+                    }
+                }
+            }
+        }
+    }
+
+}