您的位置:首页 > 编程语言 > Java开发

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

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

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

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

文件列表:

/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

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

/**
*
* @param host
* @param username
* @param password
* @param remoteDerectory
* @param port
* @throws IOException
*/
public static void rmDirectoryNotEmpty(String host, String username,
String password,

String remoteDerectory, int port) throws IOException {

if (logger.isInfoEnabled()) {

logger.info("rm [" + remoteDerectory + "] is " + host
+ remoteDerectory);

}

// 路径格式保持统一
if (null != remoteDerectory && remoteDerectory.endsWith("/")) {
remoteDerectory = remoteDerectory.substring(0,
remoteDerectory.length() - 1);
}

Connection conn = null;

try {
conn = getOpenedConnection(host, username, password, port);

SFTPv3Client sftpClient = new SFTPv3Client(conn);

List<String> filelist = new ArrayList<String>();

List<String> direlist = new ArrayList<String>();
direlist.add(remoteDerectory);

Vector v = sftpClient.ls(remoteDerectory);

getUrlPath(sftpClient, filelist, direlist, remoteDerectory);

System.out.println("file list is::");
for (int i = filelist.size() - 1; i > -1; i--) {
System.out.println(filelist.get(i));
sftpClient.rm(filelist.get(i));
}

System.out.println("directory list is::");
for (int i = direlist.size() - 1; i > -1; i--) {
System.out.println(direlist.get(i));
sftpClient.rmdir(direlist.get(i));
}
sftpClient.close();

} finally {
if (null != conn) {

conn.close();

}
}

}


private static void getUrlPath(SFTPv3Client sftpClient,
List<String> filelist, List<String> direlist, String remoteDerectory)
throws IOException {

Vector v = sftpClient.ls(remoteDerectory);
for (Iterator iterator = v.iterator(); iterator.hasNext();) {
SFTPv3DirectoryEntry object = (SFTPv3DirectoryEntry) iterator
.next();
System.out.println(object.filename);
if (object.attributes.isDirectory()
&& object.filename.indexOf(".") == -1) {
String rderectory = remoteDerectory + "/" + object.filename;
direlist.add(rderectory);
getUrlPath(sftpClient, filelist, direlist, rderectory);

} else if (!object.filename.startsWith(".")
&& !object.filename.endsWith(".")) {
String path = remoteDerectory + "/" + object.filename;
filelist.add(path);
}
}

}


这个方法中的目录校验不太严格:应该用正则表达式匹配比较合适:

!object.filename.startsWith(".")
&& !object.filename.endsWith("."))
这个地方的
object.filename
会是. .. ... ....等,主要是避免这些文件名称的,此处做简单处理了。

测试代码:

String remoteDir = "/usr/local/test/";

try {

CommandRunner.rmNotEmptyDirectory("172.16.18.141", "root",
"123456", remoteDir, 22);

} catch (IOException e) {
e.printStackTrace();
}


执行结果:



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

下一篇将对此代码部分做一些讲解,后面将出如何用更简单的办法删除目录非空目录。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: