问题重现:
删除指定目录下的所有的空文件和空文件夹(包含子文件夹下的内容)
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);
}
}
}
}