2014-12-01 171 views
0

我試圖通過SFTP刪除非空文件夾的JSCH,但它沒有奏效。SFTP非空文件夾遞歸刪除

這一個工作,但它不是免費的:(我已經過去30天的試用期。我公司拒絕支付他們只是通過SFTP刪除的文件夾。

package com.test.cvsutil; 

import java.util.List; 

import org.apache.log4j.Logger; 

import com.jscape.inet.sftp.Sftp; 
import com.jscape.inet.sftp.SftpException; 
import com.jscape.inet.sftp.events.SftpAdapter; 
import com.jscape.inet.ssh.util.SshParameters; 

public class SFTPFileDeleter extends SftpAdapter { 
    static String hostName = ServerProperties.getProperty("test.ftp.hostname"); 
    static String username = ServerProperties.getProperty("test.ftp.login"); 
    static String password = ServerProperties.getProperty("test.ftp.password"); 
    static String directory = ServerProperties.getProperty("test.ftp.directory"); 
    private static Sftp sftp; 

    private static org.apache.log4j.Logger log = Logger.getLogger(SFTPFileDeleter.class); 


    public static boolean deleteDir(List <String> path) throws SftpException { 
     Boolean flag = false; 
     log.info("------------------------ file(s) delete started ------------------------"); 
     sftp = new Sftp(new SshParameters(hostName, username, password)); 

     sftp.connect(); 
     sftp.setDir(directory); 

     for (String eachOne : path) { 
      if (!sftp.getDirListingAsString(eachOne).equals("")){ 
       log.info(" ------ Deleted Folder/Scenario Name: " + eachOne); 
       //log.info(" ------ check file path: " + directory+eachOne); 
       //System.out.println(directory+eachOne); 
       sftp.deleteDir(directory+eachOne, true); 
       flag = true; 
      } 
     } 

     sftp.disconnect(); 
     log.info("------------------------ file(s) delete finished -----------------------"); 

     return flag; 
    } 

    // open connection to the remote server. 
    public static void openConnection() throws SftpException { 
     sftp.connect(); 
    } 

    // disconnect from the remote server. 
    public static void closeConnection() { 
     sftp.disconnect(); 
    } 
} 

,這是錯誤我得到了,所以jscape sftp不會爲我工作。

2014-11-29 09:00:04 ERROR MainEntry:47 - There was error and message is java.lang.RuntimeException: Your Secure FTP Factory license expired on Sun Nov 23 00:31:21 CST 2014. Please v 
isit http://www.jscape.com to purchase a licensed copy. 
2014-11-29 09:00:04 ERROR MainEntry:48 - There was error and stack-trace is [Ljava.lang.StackTraceElement;@fdb00d 

任何的幫助深表感謝。在這裏詢問是否有人知道,它刪除非空文件夾其他庫。

+1

您可以在http://softwarerecs.stackexchange.com/ – 2014-12-01 16:30:13

+2

問這樣的問題了爲什麼不直接使用jsch試圖刪除文件夾之前,遞歸地刪除文件夾中的一切嗎?獲取目錄中所有內容的列表並遍歷它們。測試每個以查看它是否是文件或目錄。如果它是一個目錄,請進行遞歸調用以將其清空並將其刪除。如果它是一個文件,只需刪除它。 – Rob 2014-12-01 16:33:33

+0

@ jiten-k你在這裏尋找什麼樣的答案?尋找第三方,充分運作的軟件的問題在這裏是無關緊要的。您發佈的代碼顯然不起作用,因爲您的JScape庫的許可證已過期。你應該能夠以jsch來實現這個,但是你沒有提供關於你的jsch嘗試的任何細節。 – Kenster 2014-12-01 19:15:11

回答

7

我能夠遞歸刪除目錄。謝謝@Rob

這裏是代碼,這將有助於如果有人在那裏尋找它。

public static void deleteDirectory(ChannelSftp sftp, String oldestBackup) throws SftpException { 
    if (isDir(sftp, oldestBackup)) { 
     sftp.cd(oldestBackup); 
     Vector <LsEntry> entries = sftp.ls("."); 
     for (LsEntry entry: entries) { 
      deleteDirectory(sftp, entry.getFilename()); 
     } 
     sftp.cd(".."); 
     sftp.rmdir(oldestBackup); 
    } else { 
     sftp.rm(oldestBackup); 
    } 
} 

private static boolean isDir(ChannelSftp sftp, String entry) throws SftpException { 
    return sftp.stat(entry).isDir(); 
} 
+1

A **警告**給想要直接使用此代碼段的人:'ChannelSftp#ls'方法也會列出父目錄和當前目錄。在測試之前,必須修改此代碼**。 – wangkaibule 2017-04-28 10:34:40