1. 程式人生 > >比較不同目錄資料夾下同名檔案的數量和顯示同名檔名

比較不同目錄資料夾下同名檔案的數量和顯示同名檔名

大概思路:1、得到檔案目錄和目錄下的檔案,並把檔案儲存在list集合中

2、使用map集合把檔名存在key中,value值存檔案對應的路徑

3、把一個資料夾下和另一個檔案下同名的檔案移除

4、使用強for語句遍歷map

有優化方法還請大家多多指教。

package file.compare;

import java.io.File;
import java.io.FileFilter;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.Map.Entry;
import java.util.Scanner;

public class CompareFileName {
	public static void main(String[] args) {
		// 過濾字尾名的物件
		FileFilter filterByFile = (FileFilter) new FilterByFile("");
		// 路徑下的檔案物件
		File dirA = new File("C:\\Users\\Administrator\\Desktop\\新建資料夾\\");
		File dirB = new File("C:\\Users\\Administrator\\Desktop\\OprObject\\");
		// 儲存檔案的list物件
		List<File> listA = new ArrayList<File>();
		List<File> listB = new ArrayList<File>();
		// 呼叫相應方法,新增檔案到集合
		listA = getFileList(dirA, listA, filterByFile);
		listB = getFileList(dirB, listB, filterByFile);
		// 只儲存檔名和檔案路徑的map物件
		Map<String, String> mapA = new HashMap<String, String>();
		Map<String, String> mapB = new HashMap<String, String>();
		for (File file : listA) {
			mapA.put(file.getName(), file.getPath());
		}
		for (File file : listB) {
			mapB.put(file.getName(), file.getPath());
		}
		System.out.println("輸入A或者B,輸入A表示顯示A資料夾中獨有的內容B亦然");
		Scanner str = new Scanner(System.in);

		if ("A".equals(str.nextLine())) {
			mapA.keySet().removeAll(mapB.keySet());// 移除檔名及字尾相同的檔案
			System.out.println("A資料夾有而B資料夾沒有的檔案:");
			int count = 0;
			for (Entry<String, String> entry : mapA.entrySet()) {
				System.out.println(entry.getKey());
				count++;
			}
			System.out.println("不相同的檔案個數:" + count);
		} else {
			mapB.keySet().removeAll(mapA.keySet());// 移除檔名及字尾相同的檔案
			System.out.println("B資料夾有而A資料夾沒有的檔案:");
			int countA = 0;
			for (Entry<String, String> entry : mapB.entrySet()) {
				System.out.println(entry.getKey());
				countA++;
			}
			System.out.println("不相同的檔案個數:" + countA);
		}

	}

	private static List<File> getFileList(File dir, List<File> list, FileFilter filterByFile) {
		// 遍歷路徑下的所有檔案
		File[] files = dir.listFiles();
		for (File file : files) {
			if (file.isDirectory()) {
				getFileList(file, list, filterByFile);// 如果是目錄需要遞迴
			} else {
				if (filterByFile.accept(file))
					list.add(file);
			}
		}
		return list;
	}
}

public class FilterByFile implements FileFilter {

	public String suffix;

	public FilterByFile(String suffix) {
		super();
		this.suffix = suffix;
	}

	public boolean accept(File pathname) {
		return pathname.getName().endsWith(suffix);
	}

}