Ganymed SSH-2 for Java系列6之删除远程服务器上的非空目录

来源:互联网 发布:cad mac中文破解版2016 编辑:程序博客网 时间:2024/04/30 04:41

上一篇已经讲到如何删除一个服务器上面的目录,但是只能删除非空目录,如果是一个非空目录,其下面存在着目录和文件,并且目录中还有目录和文件,

这个该如何删除啦,下面给出方法:


首先给出服务器上的目录结构:

文件列表:
/usr/local/test/tt.txt
/usr/local/test/kk/ttp/t.txt
/usr/local/test/kk/ttt.txt
/usr/local/test/ttt/t.txt

目录列表:
/usr/local/test/kk/ttp
/usr/local/test/kk
/usr/local/test/ttt
/usr/local/test


继续在以前的方法中增加静态方法:


[java] view plaincopy在CODE上查看代码片派生到我的代码片
  1. /** 
  2.      *  
  3.      * @param host 
  4.      * @param username 
  5.      * @param password 
  6.      * @param remoteDerectory 
  7.      * @param port 
  8.      * @throws IOException 
  9.      */  
  10.     public static void rmDirectoryNotEmpty(String host, String username,  
  11.             String password,  
  12.   
  13.             String remoteDerectory, int port) throws IOException {  
  14.   
  15.         if (logger.isInfoEnabled()) {  
  16.   
  17.             logger.info("rm [" + remoteDerectory + "] is " + host  
  18.                     + remoteDerectory);  
  19.   
  20.         }  
  21.   
  22.         // 路径格式保持统一  
  23.         if (null != remoteDerectory && remoteDerectory.endsWith("/")) {  
  24.             remoteDerectory = remoteDerectory.substring(0,  
  25.                     remoteDerectory.length() - 1);  
  26.         }  
  27.   
  28.         Connection conn = null;  
  29.   
  30.         try {  
  31.             conn = getOpenedConnection(host, username, password, port);  
  32.   
  33.             SFTPv3Client sftpClient = new SFTPv3Client(conn);  
  34.   
  35.             List<String> filelist = new ArrayList<String>();  
  36.   
  37.             List<String> direlist = new ArrayList<String>();  
  38.             direlist.add(remoteDerectory);  
  39.   
  40.             Vector v = sftpClient.ls(remoteDerectory);  
  41.   
  42.             getUrlPath(sftpClient, filelist, direlist, remoteDerectory);  
  43.   
  44.             System.out.println("file list is::");  
  45.             for (int i = filelist.size() - 1; i > -1; i--) {  
  46.                 System.out.println(filelist.get(i));  
  47.                 sftpClient.rm(filelist.get(i));  
  48.             }  
  49.   
  50.             System.out.println("directory list is::");  
  51.             for (int i = direlist.size() - 1; i > -1; i--) {  
  52.                 System.out.println(direlist.get(i));  
  53.                 sftpClient.rmdir(direlist.get(i));  
  54.             }  
[java] view plaincopy在CODE上查看代码片派生到我的代码片
  1. <span style="white-space:pre">          </span>  
[java] view plaincopy在CODE上查看代码片派生到我的代码片
  1. <span style="white-space:pre">          sftpClient.close();</span>  
  2.   
  3.         } finally {  
[java] view plaincopy在CODE上查看代码片派生到我的代码片
  1.         if (null != conn) {  
  2.   
  3.             conn.close();  
  4.   
  5.         }  
  6.     }  
  7.   
  8. }  

[java] view plaincopy在CODE上查看代码片派生到我的代码片
  1. private static void getUrlPath(SFTPv3Client sftpClient,  
  2.             List<String> filelist, List<String> direlist, String remoteDerectory)  
  3.             throws IOException {  
  4.   
  5.         Vector v = sftpClient.ls(remoteDerectory);  
  6.         for (Iterator iterator = v.iterator(); iterator.hasNext();) {  
  7.             SFTPv3DirectoryEntry object = (SFTPv3DirectoryEntry) iterator  
  8.                     .next();  
  9.             System.out.println(object.filename);  
  10.             if (object.attributes.isDirectory()  
  11.                     && object.filename.indexOf(".") == -1) {  
  12.                 String rderectory = remoteDerectory + "/" + object.filename;  
  13.                 direlist.add(rderectory);  
  14.                 getUrlPath(sftpClient, filelist, direlist, rderectory);  
  15.   
  16.             } else if (!object.filename.startsWith(".")  
  17.                     && !object.filename.endsWith(".")) {  
  18.                 String path = remoteDerectory + "/" + object.filename;  
  19.                 filelist.add(path);  
  20.             }  
  21.         }  
  22.   
  23.     }  


这个方法中的目录校验不太严格:应该用正则表达式匹配比较合适:
[java] view plaincopy在CODE上查看代码片派生到我的代码片
  1. !object.filename.startsWith(".")  
  2.                     && !object.filename.endsWith("."))  
这个地方的
[java] view plaincopy在CODE上查看代码片派生到我的代码片
  1. object.filename  
会是.  ..  ...  ....等,主要是避免这些文件名称的,此处做简单处理了。


测试代码:

[java] view plaincopy在CODE上查看代码片派生到我的代码片
  1. String remoteDir = "/usr/local/test/";  
  2.   
  3.         try {  
  4.   
  5.             CommandRunner.rmNotEmptyDirectory("172.16.18.141""root",  
  6.                     "123456", remoteDir, 22);  
  7.   
  8.         } catch (IOException e) {  
  9.             e.printStackTrace();  
  10.         }  

执行结果:




这个地方只是简单的打印,可以去服务器上查看,目录的确已经被删除了。


下一篇将对此代码部分做一些讲解,后面将出如何用更简单的办法删除目录非空目录。
0 0
原创粉丝点击