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

17 篇文章 0 订阅
16 篇文章 0 订阅

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

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


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

文件列表:
/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();
		}

执行结果:




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


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

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值