如何使用java代码打开Windows文件资源管理器并突出显示指定文件?

问题描述 投票:0回答:8

我现在使用 java Desktop API 来操作文件资源管理器。 我知道如何打开文件资源管理器,但我不知道如何打开它并突出显示指定的文件。

当我们使用Chrome时,下载文件后,我们可以选择“显示在文件夹中”来打开文件资源管理器并突出显示下载的文件。

如何使用java Desktop API来做到这一点? 或者java中有没有其他API可以实现这个动作?

java windows explorer
8个回答
59
投票

用途:

Runtime.getRuntime().exec("explorer.exe /select,\"" + path + "\"");

如果

PATH
中有空格,这也适用。


43
投票

编辑:

从 java 9 开始,桌面 API 中现在有一个方法来选择文件

desktop.browseFileDirectory(<file>)

编辑:

您无法使用 java Desktop API 突出显示特定文件。

原始问题的答案:

桌面 API 将允许您使用此代码片段来完成此操作,

File file = new File ("c:\<directory>");
Desktop desktop = Desktop.getDesktop();
desktop.open(file);

上面使用的代码的文档位于这些链接, http://docs.oracle.com/javase/10/docs/api/java/awt/Desktop.htmlhttp://docs.oracle.com/javase/10/docs/api/java/io/File.html

在 Windows 计算机上,这将打开默认文件资源管理器,在其他系统上,它将分别打开其默认资源管理器。

或者,您可以使用新的 java Path API 构建所需的路径,然后调用返回相应 File 对象的方法。

为了简洁起见,我排除了检查代码以确保桌面和文件对象存在。


28
投票

桌面 API 不支持此功能。您将必须使用

ProcessBuilder
(或者
Runtime.exec()
)来显式执行 explorer.exe 使用您想要的选项。不过,这仅适用于 Windows,如果您想在其他操作系统上运行它,您无论如何都必须使用桌面 API。

Process p = new ProcessBuilder("explorer.exe", "/select,C:\\directory\\selectedFile").start();

3
投票

我们可以使用以下命令从命令行打开特定路径:

start C:/ProgramData

在java中有两种方法可以使用特定路径打开Windows资源管理器:

  1. 使用进程类(如已回答)但使用启动命令

    try {
        Process builder = Runtime.getRuntime().exec("cmd /c start C:/ProgramData");
    } catch (IOException e) {
        e.printStackTrace();
    }
    
  2. 使用桌面类

    try {
        Desktop.getDesktop().open(new File("C:/ProgramData"));
    } catch (IOException e) {
        e.printStackTrace();
    }
    

2
投票

始终使用“\”而不是“/”,否则只会打开资源管理器,请阅读本文 - 可用于打开 GUI Windows 资源管理器 (Explorer.exe) 的命令行开关

使用 Windows CLI:

C:\Users\Md Arif Mustafa>explorer.exe /select, "C:\Users\Md Arif Mustafa\Music\Aafreen-Himesh.mp3"

Java 源代码中相同: 这里变量 filePaths 是一个

ArrayList<String>
并且包含一个文件夹所有文件路径。

try {
    Process proc = Runtime.getRuntime().exec("explorer.exe /select, " + filePaths.get(i).replaceAll("/", "\\\\"));
    proc.waitFor();
} catch (IOException | InterruptedException ex ) {
    ex.printStackTrace();
}

它对我有用,希望对你有帮助!


1
投票

即使文件/文件夹名称在单词之间有多个空格,这也有效。

    //In this example there are 3 spaces between "GAME" and "OF" and 2 spaces between "OF" and "Thrones"
    String onlyPath = "D:\\GAME   OF  Thrones";
    String selectPath = "/select," + onlyPath;        

    //START: Strip one SPACE among consecutive spaces
    LinkedList<String> list = new LinkedList<>();
    StringBuilder sb = new StringBuilder();
    boolean flag = true;

    for (int i = 0; i < selectPath.length(); i++) {
        if (i == 0) {
            sb.append(selectPath.charAt(i));
            continue;
        }

        if (selectPath.charAt(i) == ' ' && flag) {
            list.add(sb.toString());
            sb.setLength(0);
            flag = false;
            continue;
        }

        if (!flag && selectPath.charAt(i) != ' ') {
            flag = true;
        }

        sb.append(selectPath.charAt(i));
    }

    list.add(sb.toString());

    list.addFirst("explorer.exe");
    //END: Strip one SPACE among consecutive spaces

    //Output List
    for (String s : list) {
        System.out.println("string:"+s);
    }
    /*output of above loop

    string:explorer.exe
    string:/select,D:\GAME
    string:  OF
    string: Thrones

    */

    //Open in Explorer and Highlight
    Process p = new ProcessBuilder(list).start();

1
投票

这是上面的简短版本。

    String onlyPath = "D:\\GAME   OF  Thrones";
    String completeCmd = "explorer.exe /select," + onlyPath;
    new ProcessBuilder(("explorer.exe " + completeCmd).split(" ")).start();

1
投票

正确

ProcessBuilder
代码实际上如下:

public static void selectFileInFileExplorer(final Path filePath) throws IOException {
    final String windowsDirectory = System.getenv("WINDIR");
    final String explorerFilePath = windowsDirectory + "\\explorer.exe";
    final ProcessBuilder builder = new ProcessBuilder(explorerFilePath, "/select,", filePath.toString());
    builder.start();
}

注意,

/select,
之后需要启动新命令,否则会打开
Documents
文件夹。

© www.soinside.com 2019 - 2024. All rights reserved.