【问题标题】:Find file path in windows using Java使用Java在Windows中查找文件路径
【发布时间】:2026-02-04 11:50:01
【问题描述】:

有没有办法在 windows 中找到特定的文件路径。例如说我想在我的本地找到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 中,它将执行,如果不是,则必须查看整个磁盘。
  • 我必须创建一个逻辑来在本地运行 exe,但我不知道文件的位置。对于不同的用户,路径可能不同。这就是为什么我需要找到文件路径然后运行它。
  • 这就是我的观点。你不需要知道它是否在 PATH 上。
  • @EJP 它不在 PATH 上。
  • 在这种情况下,您应该将 Putty 与您的程序一起提供以便您知道在哪里可以找到它,或者将其作为先决条件并在您的用户之间共享一个约定。我认为最好的约定是每个用户都将 Putty 添加到 PATH 中。

标签: java windows file io


【解决方案1】:

没有程序会扫描整个磁盘来寻找它需要的文件。

程序使用以下技术之一:

  1. 在查找可执行文件时,查看 PATH 环境变量中的目录
  2. 要求用户在安装时提供文件的位置并将它们存储在已知的位置。这可能是存储在程序主目录中的.ini 文件;在 Windows 上:系统注册表或用户或系统环境变量(最终也出现在注册表中)。
  3. 安装程序会创建一个启动器 shell 脚本,该脚本设置由程序读取的特定于应用程序的环境变量。

可能还有几个我没有想到的。这个想法是限制程序必须搜索的地方。

【讨论】:

  • 我的代码将由许多不同的用户运行。他们每个人都不会在任何地方提到路径。例如在我当地。我在下载中有那个特定的 .exe 文件,这在其他用户的情况下可能会有所不同。所以我没有一个常见的场景来找出文件。我只知道文件名。
  • 那么你必须告诉用户在搜索时要耐心等待,或者让他们告诉你。当您找到它时,将位置保存在您可以随时检索的固定位置。
【解决方案2】:

当他们以常规方式安装可执行文件时,它位于 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"));

可能 var 模式替换是自动完成的(%JAVA_HOME% 等)

【讨论】:

  • 部分exe没有安装。像腻子一样。我下载的时候直接得到一个.exe文件,PATH变量中没有提到它的路径。
  • 运气不好。PATH+Putty*\putty.exe这样的尝试?添加下载目录?扫描整个用户的目录树? 可能不会。我不相信腻子会注册某些文件类型 - 所以Desktop.getDestop.open(file) 会启动腻子。但是Windows具有功能。 Windows 具有可选的文件索引和搜索功能。 regedit 可能会保留 putty 的条目,但并非所有非管理员都可以访问它。也许有人知道。
  • Desktop.getDesktop().open(file) 只有在知道文件在哪里时才会运行该文件。我的主要问题是所有用户的路径可能不同。 :(
  • 这意味着打开一些文件类型注册为putty的数据文件。我知道没有这样的人。然后可以打开自己的数据文件,然后启动腻子。但是我上次使用 putty 时是一个非常简单的工具(来自 Simon Tatham?)。
最近更新 更多