Problem Solving

[Java] Requirements Q118: 폴더 정렬

Isaac S. Lee 2023. 8. 8. 10:51
import java.io.File;
import java.util.ArrayList;

public class Q118 {

	public static void main(String[] args) {
		/*
		● 요구사항
		폴더 내의 모든 파일들을 찾아 크기를 비교하고, 크기가 큰 순으로 정렬하시오.
		
		● 조건
		- 자식 폴더내의 파일도 모두 검색하시오.
		- 부모 자식 폴더에 상관없이 파일을 한번에 비교하시오.
		
		● 리소스
		- 폴더 > 크기 정렬
		- 파일 다운로드
		
		● 출력
		[파일명]      [크기]     [파일이 들어있는 폴더]
		aaa.exe    57KB    AAA 
		bbb.exe    50KB    BBB 
		ccc.dat     41KB    AAA 
		ddd.txt     20KB    CCC 
		..
		*/
		
		String path = "C:\\Class\\code\\java\\file\\파일_디렉토리_문제\\크기 정렬";
		
		File dir = new File(path);
		
		ArrayList<File> flist = new ArrayList<File>();
		
		addFile(dir, flist);
		
		for (int i = 0; i < flist.size() - 1; i++) {
			for (int j = 0; j < flist.size() - i - 1; j++) {
				if (flist.get(j).length() < flist.get(j + 1).length()) {
					File temp = flist.get(j);
					flist.set(j, flist.get(j + 1));
					flist.set(j + 1, temp);
				}
			}
		}
		
		System.out.printf("%-33s%s\t%10s\n", "[파일명]", "[크기]", "[파일이 들어있는 폴더]");
		
		for (File file : flist) {
			System.out.printf("%-30s\t%10s\t%s\n"
								, file.getName()
								, getSize(file.length())
								, file.getParentFile().getName());
		}
	}

	private static String getSize(long length) {
    
		if (length < 1024) {
			return length + "B";
		} else if (length < 1024 * 1024) {
			return String.format("%.1f", length / 1024.0) + "KB";
		} else if (length < 1024 * 1024 * 1024) {
			return String.format("%.1f", length / 1024.0 / 1024.0) + "MB";
		} else if (length < 1024 * 1024 * 1024 * 1024) {
			return String.format("%.1f", length / 1024.0 / 1024.0 / 1024.0) + "GB";
		} else if (length < 1024 * 1024 * 1024 * 1024 * 1024) {
			return String.format("%.1f", length / 1024.0 / 1024.0 / 1024.0 / 1024.0) + "TB";
		}
		return 0 + "B";
	}
	
	private static void addFile(File dir, ArrayList<File> flist) {
		
		File[] list = dir.listFiles();
		
		for (File file : list) {
			if (file.isFile()) {
				flist.add(file);
			}
		}
		
		for (File subdir : list) {
			if (subdir.isDirectory()) {
				addFile(subdir, flist);
			}
		}
	}
}