如何使用java在打开的资源管理器窗口中选择文件

bhmjp9jg  于 2022-09-17  发布在  Java
关注(0)|答案(4)|浏览(372)

我正在尝试制作一个程序来下载一些文件,现在我想打开这些文件所在的文件夹(在windows资源管理器上)(它始终是同一个文件夹),并选择下载的最后一个文件,我找到了在java上这样做的代码:

private void openFile(File f) { 
    try { 
        Runtime.getRuntime().exec("explorer.exe  /select," + f.getAbsolutePath());             
    } catch (Exception ex) { 
        System.out.println("Error - " + ex); 
    } 
}

它可以工作,但每次我按下按钮打开文件夹时,它都会打开一个新的资源管理器窗口,其中包含选定的文件,因此我最终打开了许多资源管理器的窗口。是否有方法对已打开的文件夹执行此操作?
我一直在网上寻找这个,但我只找到了我已经使用的相同代码。关于这个问题的所有其他帖子都是多年前的,所以我不知道以前的版本是否也这样。
如果你们能帮助我的话,我非常感谢。

insrf1ej

insrf1ej1#

它可以工作,但每次我按下按钮打开文件夹时,它都会打开一个新的资源管理器窗口,其中包含选定的文件,因此我最终打开了许多资源管理器的窗口。是否有方法对已打开的文件夹执行此操作?
尝试开始。它应该将焦点放在以相同路径打开的现有资源管理器窗口上。

wko9yo5t

wko9yo5t2#

嗨,谢谢你帮助我。
你的意思是像这样使用开始?我只是尝试了这种方法,每次都会打开一个新的资源管理器窗口。

    private void openFile(File f) { 
        try {   
            String comand = "cmd.exe /c start explorer.exe /select," + f.getAbsolutePath(); 
            Runtime.getRuntime().exec(comand);   
        } catch (Exception ex) { 
            System.out.println("Error - " + ex); 
        } 
    }
dly7yett

dly7yett3#

*$start C:\Users\user\Desktop*

没有可用于此操作的选择开关,因此仅适用于目录。
我试了一些东西。考虑一个文件abc。cpp需要在现有资源管理器窗口中具有焦点。
使用Java桌面API:

File file = new File("C:\\Users\\user\\Documents\\abc.cpp"); 
Desktop desktop = Desktop.getDesktop(); 
desktop.browseFileDirectory(file);

O/P-java.lang.UnsupportedOperationException:当前平台不支持BROWSE_FILE_DIR操作
win 10:https://bugs.openjdk.java.net/browse/JDK-8233994似乎有一个未解决的错误
方法#2:存储资源管理器的processid,并尝试在调用新窗口之前使用相同的对象销毁上一个窗口。

Process p = null; 
ProcessBuilder pb = null; 
... 
pb = new ProcessBuilder("explorer.exe", "/select," + "C:\\Users\\user\\Documents\\abc.cpp"); 
p = pb.start();

//当不是第一种情况时,使用标志变量执行以下行

p.waitFor(); 
p.notifyAll(); 
p.destroyForcibly();

这不起作用。进程作为外部线程运行,当前线程不是所有者。
另一种解决方法,但根本不是理想/合适的解决方案。它将重置任务栏和其他子进程。资源管理器由userinit进程创建,许多进程都是它的子进程。所以在周围玩耍可能不是个好主意。

$taskkill/IM浏览器。exe/F和资源管理器。exe/选择“C:\Users\user\Documents\abc.cpp”&explorer.exe

最后一个命令被附加以重新启动并再次看到任务栏和托盘图标。我不建议这样做。“解决方案不能比问题本身更糟糕。”
像JFileChooser这样的API模态对话框可以与setSelectedFile()一起使用。这样,一次只能激活一个子对话框,并且只有在对话框窗口关闭后才能再次与父帧进行交互。这种行为可能不符合您的要求。

mbzjlibv

mbzjlibv4#

非常感谢,我尝试的第一件事是browseFileDirectory方法,但无法使其工作,我希望有一天他们会修复该方法。我想伊玛试试这个。

*$start C:\Users\user\Desktop*

按创建文件排序文件更容易,只需按“主页”键即可选择最后一个文件。如果没有,我将尝试filechooser,看看您是否可以使用它移动或重命名文件。
非常感谢。
编辑:实际上,我在想,程序是否可能“按下”键,如果是,它可以按文件名的字母,并最终选择实际文件。
但我不知道是否有一种方法可以将键发送到java上的浏览器窗口,我会做一些研究。

相关问题