有没有办法在窗口中找到特定的文件路径。例如,假设我想在本地查找putty.exe
的位置,有什么方法可以获取完整的文件路径吗?我使用实用程序尝试了以下代码apache commons-io
但这需要很多时间,因为本地有很多文件。
File dir = new File("C:\");
String[] extensions = new String[]{"exe"};
IOFileFilter filter = new SuffixFileFilter(extensions, IOCase.INSENSITIVE);
List<File> fileList = (List<File>) FileUtils.listFiles(dir, filter, DirectoryFileFilter.DIRECTORY);
System.out.println("file list size "+fileList.size());
for (File file : fileList) {
if (file.getName().toLowerCase().contains("putty")) {
System.out.println(file.getPath());
}
}
还有没有其他更快的方法?
编辑我想特别找到putty.exe
。
没有任何程序会扫描整个磁盘以查找所需的文件。
程序使用以下技术之一:
- 查找可执行文件时,请查看 PATH 环境变量中的目录
- 要求用户在安装时提供文件的位置,并将其存储在已知位置。这可以是存储在程序主目录中的
.ini
文件;在 Windows 上:系统注册表或用户或系统环境变量(最终也会出现在注册表中)。 - 安装程序创建一个启动器 shell 脚本,该脚本设置由程序读取的应用程序特定环境变量。
可能还有其他几个我没有想到的。 这个想法是限制程序必须搜索的位置。
当他们以常规方式安装可执行文件时,它位于 PATH 变量上。
public static Optional<Path> exePath(String exeName) {
String pathVar = System.getenv("PATH");
Pattern varPattern = Pattern.compile("%(\w+)%");
boolean tryVars = true;
while (tryVars) {
tryVars = false;
Matcher m = varPattern.matcher(pathVar);
StringBuffer sb = new StringBuffer();
while (m.find()) {
tryVars = true;
m.appendReplacement(sb, System.getenv(m.group(1)));
}
m.appendTail(sb);
pathVar = sb.toString();
}
String[] dirs = pathVar.split("\s*;\s*");
for (String dir : dirs) {
Path path = Paths.get(dir, exeName);
if (Files.exists(path)) {
return Optional.of(path);
}
}
return Optional.empty();
}
System.out.println(exePath("java.exe"));
可能变量模式替换是自动完成的(%JAVA_HOME% 等)