上一篇已经讲到如何删除一个服务器上面的目录,但是只能删除非空目录,如果是一个非空目录,其下面存在着目录和文件,并且目录中还有目录和文件,
这个该如何删除啦,下面给出方法:
首先给出服务器上的目录结构:
文件列表:
/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();
}
执行结果:
这个地方只是简单的打印,可以去服务器上查看,目录的确已经被删除了。
下一篇将对此代码部分做一些讲解,后面将出如何用更简单的办法删除目录非空目录。