天天看點

用Java仿一個低配版的Everything軟體

用Java仿一個低配版的Everything軟體

"Everything" 是什麼?

"Everything" 是 Windows 上一款搜尋引擎,它能夠基于檔案名快速定檔案和檔案夾位置。

不像 Windows 内置搜尋,"Everything" 預設顯示電腦上每個檔案和檔案夾 (就如其名 "Everything")。

您在搜尋框輸入的關鍵詞将會篩選顯示的檔案和檔案夾。

總的來說,Everything是一款免費的可以快速檢索檔案、檔案夾的,并且占用資源比較少的Windows應用軟體。

制作低配版 "Everything"

我們今天就使用Java來制作一個低配版"Everything"吧!

先上主函數:

public static void main(String[] args) {
    System.out.println("*********************");
    System.out.println("Welcome To Everything");
    System.out.println("*********************");
    
    System.out.println("請輸入要查找的檔案名:");
    String fileName=scanner.next();
    
    System.out.println("檔案名稱\t檔案路徑\t檔案大小\t檔案最後修改時間");
    
    File[] Drive_letters=File.listRoots();
    for(File dl:Drive_letters)
    {
        find(dl,fileName);
    }
}           

這裡暫時不使用圖形化界面,先是指令行界面,最開始簡單輸出提示語。

然後輸入要查找的檔案名或者檔案夾名,然後因為Everything是隻能在Windows下運作,是以我們隻考慮Windows環境下查找檔案。(竊喜~)

而Windows的檔案系統可能有多個根目錄,是以我們用到File.listRoots(),下面來介紹一下File.listRoots()。

介紹File.listRoots()

Java 支援零個或多個檔案系統。 而每個檔案系統都有一個 {@code root} 目錄,從中可以通路該檔案系統中的所有其他檔案。 例如,Windows 平台為每個活動驅動器都有一個根目錄; UNIX 平台有一個根目錄,即 {@code "/"}。 可用檔案系統根集會受到各種系統級操作的影響,例如可移動媒體的插入或彈出以及實體或虛拟磁盤驅動器的斷開或解除安裝。

此方法傳回一個 {@code File} 的對象數組,這些對象表示可用檔案系統的根目錄。 可以保證本地機器上實體存在的任何檔案的規範的路徑名都可以以該方法傳回的其中一個根(例如Windows平台下的C、D、E)開始。

使用File.listRoots()就可以得到電腦的檔案系統的各個根目錄,然後分别在各個根目錄尋找我們要找的檔案。

下面看一看我們寫的查找檔案的函數。

public static void find(File file, String fileName) {
        if (null != file) {
            if (file.isDirectory()) {
                File[] files = file.listFiles();
                if (null != files && files.length > 0) {
                    for (File f : files) {
                        find(f, fileName);
                    }
                }

            } else {

                String fName = file.getName();


                if (fName.contains(fileName)) {
                    String fileResultName = file.getName();
                    String fileResultPath = file.getAbsolutePath();
                    long fileResultSize = file.length();
                    long fileResultModify = file.lastModified();

                    System.out.println(fileResultName + "\t" + fileResultPath + "\t" + fileResultSize + "\t" + fileResultModify);
                }
            }
        }
    }
           

先是判斷檔案或檔案夾是否為空,這些檔案或檔案夾可能是隐藏的或者是被保護的。

然後判斷這個file是否是檔案夾,如果是檔案夾,就使用file.listFiles()擷取裡面所有檔案,得到一個檔案類型數組。

然後判斷檔案夾是否為空,如果為空,則不進去。如果不為空,周遊檔案類型數組,然後每次都使用遞歸繼續查找。

如果這個file不是檔案夾,就不需要遞歸了。

我們比對這個檔案的檔案名是否與要查找的一緻,如果一緻就列印檔案或檔案夾的檔案名\檔案夾名、絕對路徑、檔案\檔案夾大小和最後修改時間。

The End..

See you~