1. 程式人生 > >HDFS練習5-----刪除指定目錄下的所有的空檔案和空資料夾(包含子資料夾下的內容)

HDFS練習5-----刪除指定目錄下的所有的空檔案和空資料夾(包含子資料夾下的內容)

問題重現:

刪除指定目錄下的所有的空檔案和空資料夾(包含子資料夾下的內容)

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);
			}
			
		}
				
	}
	
}