首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> Java 程式設計 >> Java 相關知識

Java 實現修改文件查找工具:基於最後修改時間的增量發布文件篩選

     編輯:Java 相關知識

發布部署時常需篩選「上次發布後修改過的文件」。本文提供一個 Swing GUI 工具,掃描目錄、按修改時間篩選、生成 DOS 批次複製腳本,避免 Java 複製導致文件時間戳變更。

核心需求

  • 輸入:源目錄、目標目錄、基準時間(上次發布時間)
  • 邏輯:遞歸掃描源目錄,篩選 lastModified() > 基準時間 的文件
  • 輸出:生成 xcopy /D /E /Y 批次腳本,保留目錄結構與時間戳
  • 介面:圖形化配置、預覽、一鍵生成腳本

關鍵實作類別

1. 文件掃描與篩選

public class IncrementalFileScanner {
    public static List<File> scanModifiedAfter(File root, long baselineMillis) {
        List<File> result = new ArrayList<>();
        scanRecursive(root, baselineMillis, result);
        return result;
    }
    
    private static void scanRecursive(File dir, long baseline, List<File> collector) {
        File[] children = dir.listFiles();
        if (children == null) return;
        
        for (File child : children) {
            if (child.isFile()) {
                if (child.lastModified() > baseline) {
                    collector.add(child);
                }
            } else if (child.isDirectory()) {
                scanRecursive(child, baseline, collector);
            }
        }
    }
}

2. 批次腳本生成(Windows)

public class BatchScriptGenerator {
    public static String generateXcopyScript(List<File> files, File sourceRoot, File targetRoot) {
        StringBuilder sb = new StringBuilder();
        sb.append("@echo off\n");
        sb.append("rem 增量發布腳本 - 自動生成\n");
        sb.append("rem 生成時間: ").append(new Date()).append("\n\n");
        
        for (File file : files) {
            String relativePath = getRelativePath(sourceRoot, file);
            File targetFile = new File(targetRoot, relativePath);
            String targetDir = targetFile.getParentFile().getAbsolutePath();
            
            // 確保目標目錄存在
            sb.append("if not exist \"").append(targetDir).append("\" mkdir \"").append(targetDir).append("\"\n");
            // xcopy 保留屬性、時間戳、遞歸
            sb.append("xcopy /D /E /Y /I \"").append(file.getAbsolutePath()).append("\" \"").append(targetDir).append("\\\"\n");
        }
        return sb.toString();
    }
}

3. Swing GUI 主介面

public class IncrementalDeployTool extends JFrame {
    private JTextField sourceDirField, targetDirField;
    private JSpinner baselineSpinner; // 日期時間選擇器
    private JTextArea previewArea;
    
    public IncrementalDeployTool() {
        setTitle("增量發布文件篩選工具");
        setDefaultCloseOperation(EXIT_ON_CLOSE);
        setLayout(new BorderLayout());
        
        // 配置面板
        JPanel configPanel = new JPanel(new GridLayout(0, 2, 5, 5));
        configPanel.add(new JLabel("源目錄:"));
        sourceDirField = new JTextField(30);
        configPanel.add(sourceDirField);
        // ... 目標目錄、基準時間類似
        
        JButton scanBtn = new JButton("掃描並預覽");
        scanBtn.addActionListener(e -> doScan());
        configPanel.add(scanBtn);
        
        JButton genBtn = new JButton("生成部署腳本");
        genBtn.addActionListener(e -> generateScript());
        configPanel.add(genBtn);
        
        add(configPanel, BorderLayout.NORTH);
        
        previewArea = new JTextArea(20, 80);
        previewArea.setFont(new Font(Font.MONOSPACED, Font.PLAIN, 12));
        add(new JScrollPane(previewArea), BorderLayout.CENTER);
        
        pack();
        setLocationRelativeTo(null);
    }
    
    private void doScan() {
        File source = new File(sourceDirField.getText());
        File target = new File(targetDirField.getText());
        long baseline = ((Date) baselineSpinner.getValue()).getTime();
        
        List<File> modified = IncrementalFileScanner.scanModifiedAfter(source, baseline);
        String script = BatchScriptGenerator.generateXcopyScript(modified, source, target);
        
        previewArea.setText("找到 " + modified.size() + " 個修改文件\n\n" + script);
    }
    
    private void generateScript() {
        // 寫入 deploy_incremental.bat
    }
}

為什麼不用 Java 複製?

方式時間戳保留權限保留效能跨平台
Java NIO Files.copy()需額外 FileTime 設置需額外處理良好✅
Apache Commons IO支援部分支援良好✅
xcopy /D /E /Y (Windows)原生保留原生保留極快❌
rsync -av (Linux)原生保留原生保留極快✅

進階增強

  • MD5 校驗:雙重保險,時間戳 + 內容哈希
  • 版本控制整合:Git 獲取上次提交時間作為基準
  • 差異報告:生成 HTML 差異報告,含新增/修改/刪除統計
  • 遠程部署:SSH/SCP 整合,一鍵推送
  • 配置持久化:記住上次路徑、時間,下次自動填入

現代替代方案

生產環境建議使用成熟工具鏈:

  • Maven/Gradle + maven-antrun-plugin / copy task
  • CI/CD 流水線:Jenkins/GitLab CI + rsync/scp
  • 容器化部署:Docker 镜像層天然增量
  • 配置管理:Ansible synchronize 模組

此工具適用於「無 CI/CD、手工部署、Windows 伺服器、需保留時間戳」的輕量級場景。核心邏輯可提取為獨立庫,整合至自動化流程中。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved