HDFS练习5-----删除指定目录下的所有的空文件和空文件夹(包含子文件夹下的内容)

本文介绍了一个Java程序,用于在Hadoop HDFS中递归地删除所有空文件和空目录。程序通过检查每个文件和目录的内容来确定是否为空,并适当地进行删除操作。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

问题重现:

删除指定目录下的所有的空文件和空文件夹(包含子文件夹下的内容)

import org.apache.hadoop.conf.Configuration;
import org.apache.hadoop.fs.FileStatus;
import org.apache.hadoop.fs.FileSystem;
import org.apache.hadoop.fs.LocatedFileStatus;
import org.apache.hadoop.fs.Path;
import org.apache.hadoop.fs.RemoteIterator;

public class DeleteAllEmptyDirOrFile {
	static String url = "hdfs://hadoop01:9000";
	static String parentPath = "";
	
	public static void main(String[] args) throws Exception {
		
		
		
		Configuration conf = new Configuration();
		conf.set("fs.defaultFS", url);
		System.setProperty("HADOOP_USER_NAME","hadoop");
		
		FileSystem fs = FileSystem.get(conf);
		
		
		/**
		 * 思路:
		 * 		1、先判断指定路径的文件夹是不是空的,如果是删除,如果不是继续下面的操作
		 * 		2、接着要获取一个目录先的所有列表 无论是文件还是文件夹
		 * 		3、然后如果是文件夹判断文件夹是不是空的如果是删除  如果不是继续遍历查询
		 * 		4、如果是文件记录文件的父目录,然后判断文件长度是不是0,如果是删除文件
		 * 		5、然后判断删除文件的父目录是不是空的,如果是就删除。
		 * 
		 * 		判断文件和文件夹的类型:
		 * 		
		 * 		判断文件夹是不是空的文件夹:
		 * 
		 * 		判断文件是不是空的:
		 * 
		 * 		删除空文件后,判断文件的父目录是不是空的:
		 * 
		 * 
		 */
		
		//示例:/x/y/z/p/gg.class
		Path path = new Path("/11");
		
		//调用方法删除指定目录下的空文件夹和空文件夹
		deleteEmptyDir(fs,path);
		
		
		fs.close();
	}
	
	
	/**
	 * 通过迭代的方式删除对应目录下的的空文件或空文件夹
	 * @param fs
	 * @param path
	 * @throws Exception
	 */
	public static void deleteEmptyDir(FileSystem fs,Path path) throws Exception{
		/**
		 * 判断给定的目录是不是空文件夹,如果是删除以后退出
		 */
		FileStatus[] listStatus = fs.listStatus(path);
		if(listStatus.length == 0){
			fs.delete(path,true);
			return;
		}
		
		/**
		 * 如果给定的路径不是空的文件夹,那么获取路径下的所有的文件和文件夹
		 */
		RemoteIterator<LocatedFileStatus> ls = fs.listLocatedStatus(path);
		while(ls.hasNext()){
			LocatedFileStatus next = ls.next();
			Path currentpath = next.getPath();
			Path parentPath = currentpath.getParent();
			
			/**
			 * 删除一个空文件或空文件夹
			 */
			if(next.isDirectory()){
				if(fs.listStatus(currentpath).length == 0){
					fs.delete(currentpath,true);
				}else{
					deleteEmptyDir(fs,currentpath);
				}
			}else{
				if(next.getLen() == 0){
					fs.delete(currentpath,true);
				}
			}
			
			/**
			 * 删除完一个空文件或空文件夹之后要判断其父目录会不会应为此次删除文件或文件夹导致其成为空文件夹
			 * 如果成为空文件夹那么也要删除
			 */
			if(fs.listStatus(parentPath).length == 0){
				fs.delete(parentPath,true);
			}
			
		}
				
	}
	
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值