首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> 更多程式語言 >> 程式設計綜合問答

Apache FTPClient 實現伺服器端檔案移動:RNFR/RNTO 指令實戰

     編輯:程式設計綜合問答

常見誤區

ftp.rename("/A/file.txt", "/B/sub/file.txt") 在多數 FTP 伺服器不支援跨目錄重命名,會回傳 550 錯誤。

標準解法:RNFR + RNTO 指令序列


boolean moveFile(FTPClient ftp, String srcPath, String destPath) throws IOException {
    // 1. 切換到來源目錄(某些伺服器要求)
    String srcDir = srcPath.substring(0, srcPath.lastIndexOf('/') + 1);
    String srcName = srcPath.substring(srcPath.lastIndexOf('/') + 1);
    
    if (!ftp.changeWorkingDirectory(srcDir)) return false;
    
    // 2. 發送 RNFR (Rename From)
    int rnfr = ftp.sendCommand(FTPCmd.RNFR, srcName);
    if (rnfr != 350) return false;  // 350 Requested file action pending further information
    
    // 3. 發送 RNTO (Rename To) - 使用絕對路徑
    int rnto = ftp.sendCommand(FTPCmd.RNTO, destPath);
    return rnto == 250;  // 250 Requested file action okay, completed
}

完整範例:批次移動 XML 檔案依類型分類


private static final String DOWNLOAD_PATH = "/主文件/";
private static final String FTP_ORDER = "/訂單/";
private static final String FTP_TAXBILL = "/發票/";
private static final String FTP_WAYBILL = "/運單/";
private static final String FTP_GOODS = "/貨物/";

public void categorizeFiles(FTPClient ftp, String[] fileNames, String typeCode) 
        throws IOException {
    
    String targetDir;
    switch (typeCode) {
        case "0": targetDir = FTP_ORDER; break;
        case "1": targetDir = FTP_TAXBILL; break;
        case "2": targetDir = FTP_WAYBILL; break;
        case "3": targetDir = FTP_GOODS; break;
        default: return;
    }
    
    for (String fileName : fileNames) {
        String baseName = fileName.substring(0, fileName.lastIndexOf('.'));
        String src = DOWNLOAD_PATH + baseName + ".xml";
        String dest = targetDir + baseName + "2a.xml";
        
        if (moveFile(ftp, src, dest)) {
            log.info("移動成功: {} -> {}", src, dest);
        } else {
            log.error("移動失敗: {}", src);
        }
    }
}

注意事項

  • 伺服器需支援 RNFR/RNTO(RFC 959 標準指令)
  • 目標目錄必須預先存在,否則建立 ftp.makeDirectory(targetDir)
  • 跨檔案系統/磁碟分區移動可能不支援,需改為「下載→上傳→刪除」流程
  • 大量檔案操作建議啟用 ftp.setControlKeepAliveTimeout(300) 防止連線逾時
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved