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

trnvg8h3  于 2023-05-01  发布在  Windows
关注(0)|答案(8)|浏览(400)

我现在使用Java Desktop API来操作文件资源管理器。我知道如何打开文件资源管理器,但我不知道如何打开它并突出显示指定的文件。
当我们使用Chrome浏览器时,下载文件后,我们可以选择“显示在文件夹中”来打开文件浏览器并突出显示下载的文件。
如何使用java桌面API来做到这一点?或者在java中有没有其他API可以实现这个动作?

v09wglhw

v09wglhw1#

下面是上面的简短版本。

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

uyto3xhc2#

正确的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文件夹。

neskvpey

neskvpey3#

用途:Runtime.getRuntime().exec("explorer.exe /select," + path);
如果PATH中有空格,这也有效。

jchrr9hc

jchrr9hc4#

编辑:
从java9开始,桌面API中现在有一个方法来选择文件

desktop.browseFileDirectory(<file>)

编辑:
不能使用java Desktop API突出显示特定文件。
对原始问题的答复:
Desktop 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计算机上,这将打开默认的文件资源管理器,在其他系统上,它将分别打开其默认的资源管理器。
或者,您可以使用新的API来构建所需的路径,然后调用返回相应File对象的方法。
为了简洁起见,我排除了检查代码,以确保Desktop和File对象存在。

fwzugrvs

fwzugrvs5#

桌面API不支持此操作。您将不得不使用ProcessBuilder(或者Runtime.exec())来执行资源管理器。exe显式with the options you want。这将只适用于windows虽然,如果你想运行在另一个操作系统,你将不得不使用桌面API无论如何。

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

yvgpqqbh6#

我们可以从命令行打开一个特定的路径:

start C:/ProgramData

在java中有两种方法可以使用特定的路径打开windows资源管理器:
1.使用Process类(已回答),但使用start命令

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

1.使用Desktop类

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

5jdjgkvh7#

总是使用“\”而不是“/”,否则只有浏览器将打开,更多阅读此-Command-line switches that you can use to open the GUI Windows Explorer (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();
}

它为我工作,希望它对你有帮助!

3htmauhk

3htmauhk8#

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

//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();

相关问题