用Java仿一个低配版的Everything软件

1,400 阅读3分钟

这是我参与8月更文挑战的第16天,活动详情查看:8月更文挑战

用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~