我现在使用 java Desktop API 来操作文件资源管理器。 我知道如何打开文件资源管理器,但我不知道如何打开它并突出显示指定的文件。
当我们使用Chrome时,下载文件后,我们可以选择“显示在文件夹中”来打开文件资源管理器并突出显示下载的文件。
如何使用java Desktop API来做到这一点? 或者java中有没有其他API可以实现这个动作?
用途:
Runtime.getRuntime().exec("explorer.exe /select,\"" + path + "\"");
如果
PATH
中有空格,这也适用。
编辑:
从 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.html 和 http://docs.oracle.com/javase/10/docs/api/java/io/File.html
在 Windows 计算机上,这将打开默认文件资源管理器,在其他系统上,它将分别打开其默认资源管理器。
或者,您可以使用新的 java Path API 构建所需的路径,然后调用返回相应 File 对象的方法。
为了简洁起见,我排除了检查代码以确保桌面和文件对象存在。
ProcessBuilder
(或者 Runtime.exec()
)来显式执行 explorer.exe 使用您想要的选项。不过,这仅适用于 Windows,如果您想在其他操作系统上运行它,您无论如何都必须使用桌面 API。
Process p = new ProcessBuilder("explorer.exe", "/select,C:\\directory\\selectedFile").start();
我们可以使用以下命令从命令行打开特定路径:
start C:/ProgramData
在java中有两种方法可以使用特定路径打开Windows资源管理器:
使用进程类(如已回答)但使用启动命令
try {
Process builder = Runtime.getRuntime().exec("cmd /c start C:/ProgramData");
} catch (IOException e) {
e.printStackTrace();
}
使用桌面类
try {
Desktop.getDesktop().open(new File("C:/ProgramData"));
} catch (IOException e) {
e.printStackTrace();
}
始终使用“\”而不是“/”,否则只会打开资源管理器,请阅读本文 - 可用于打开 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();
}
它对我有用,希望对你有帮助!
即使文件/文件夹名称在单词之间有多个空格,这也有效。
//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();
这是上面的简短版本。
String onlyPath = "D:\\GAME OF Thrones";
String completeCmd = "explorer.exe /select," + onlyPath;
new ProcessBuilder(("explorer.exe " + completeCmd).split(" ")).start();
正确
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
文件夹。