【问题标题】:Trying to start a directory with java Process, says my file isn't found尝试使用 java Process 启动目录,说找不到我的文件
【发布时间】:2021-10-05 20:34:52
【问题描述】:

我有一个带有 WindowBuilder 的 gui,我希望能够单击一个按钮,然后打开一个文件目录作为新窗口。我知道在 cmd 中您为此使用“start”,但以下代码(其中 PATH + SideProjs 是从 C 开始的绝对文件路径:并且“start”是传递的命令:

Process process = Runtime.getRuntime().exec("start " + PATH + "SideProjs");

导致此错误:

java.io.IOException: Cannot run program "start": CreateProcess error=2, The system cannot find the file specified
    at java.base/java.lang.ProcessBuilder.start(ProcessBuilder.java:1128)
    at java.base/java.lang.ProcessBuilder.start(ProcessBuilder.java:1071)
    at java.base/java.lang.Runtime.exec(Runtime.java:590)
    at java.base/java.lang.Runtime.exec(Runtime.java:414)
    at java.base/java.lang.Runtime.exec(Runtime.java:311)
    at ProdSystemGUI.openFile(ProdSystemGUI.java:246)
    at ProdSystemGUI$6.actionPerformed(ProdSystemGUI.java:134)
    at java.desktop/javax.swing.AbstractButton.fireActionPerformed(AbstractButton.java:1967)
    at java.desktop/javax.swing.AbstractButton$Handler.actionPerformed(AbstractButton.java:2308)
    at java.desktop/javax.swing.DefaultButtonModel.fireActionPerformed(DefaultButtonModel.java:405)
    at java.desktop/javax.swing.DefaultButtonModel.setPressed(DefaultButtonModel.java:262)
    at java.desktop/javax.swing.plaf.basic.BasicButtonListener.mouseReleased(BasicButtonListener.java:279)
    at java.desktop/java.awt.Component.processMouseEvent(Component.java:6636)
    at java.desktop/javax.swing.JComponent.processMouseEvent(JComponent.java:3342)
    at java.desktop/java.awt.Component.processEvent(Component.java:6401)
    at java.desktop/java.awt.Container.processEvent(Container.java:2263)
    at java.desktop/java.awt.Component.dispatchEventImpl(Component.java:5012)
    at java.desktop/java.awt.Container.dispatchEventImpl(Container.java:2321)
    at java.desktop/java.awt.Component.dispatchEvent(Component.java:4844)
    at java.desktop/java.awt.LightweightDispatcher.retargetMouseEvent(Container.java:4919)
    at java.desktop/java.awt.LightweightDispatcher.processMouseEvent(Container.java:4548)
    at java.desktop/java.awt.LightweightDispatcher.dispatchEvent(Container.java:4489)
    at java.desktop/java.awt.Container.dispatchEventImpl(Container.java:2307)
    at java.desktop/java.awt.Window.dispatchEventImpl(Window.java:2764)
    at java.desktop/java.awt.Component.dispatchEvent(Component.java:4844)
    at java.desktop/java.awt.EventQueue.dispatchEventImpl(EventQueue.java:772)
    at java.desktop/java.awt.EventQueue$4.run(EventQueue.java:721)
    at java.desktop/java.awt.EventQueue$4.run(EventQueue.java:715)
    at java.base/java.security.AccessController.doPrivileged(AccessController.java:391)
    at java.base/java.security.ProtectionDomain$JavaSecurityAccessImpl.doIntersectionPrivilege(ProtectionDomain.java:85)
    at java.base/java.security.ProtectionDomain$JavaSecurityAccessImpl.doIntersectionPrivilege(ProtectionDomain.java:95)
    at java.desktop/java.awt.EventQueue$5.run(EventQueue.java:745)
    at java.desktop/java.awt.EventQueue$5.run(EventQueue.java:743)
    at java.base/java.security.AccessController.doPrivileged(AccessController.java:391)
    at java.base/java.security.ProtectionDomain$JavaSecurityAccessImpl.doIntersectionPrivilege(ProtectionDomain.java:85)
    at java.desktop/java.awt.EventQueue.dispatchEvent(EventQueue.java:742)
    at java.desktop/java.awt.EventDispatchThread.pumpOneEventForFilters(EventDispatchThread.java:203)
    at java.desktop/java.awt.EventDispatchThread.pumpEventsForFilter(EventDispatchThread.java:124)
    at java.desktop/java.awt.EventDispatchThread.pumpEventsForHierarchy(EventDispatchThread.java:113)
    at java.desktop/java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:109)
    at java.desktop/java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:101)
    at java.desktop/java.awt.EventDispatchThread.run(EventDispatchThread.java:90)
Caused by: java.io.IOException: CreateProcess error=2, The system cannot find the file specified
    at java.base/java.lang.ProcessImpl.create(Native Method)
    at java.base/java.lang.ProcessImpl.<init>(ProcessImpl.java:483)
    at java.base/java.lang.ProcessImpl.start(ProcessImpl.java:158)
    at java.base/java.lang.ProcessBuilder.start(ProcessBuilder.java:1107)
    ... 41 more

即使该文件非常存在。当我做类似的事情时:

Process process = Runtime.getRuntime().exec("notepad " + fileToOpen);

效果很好。

【问题讨论】:

  • 或许Desktop.getDesktop().browseFileDirectory(new File(PATH, "SideProjs")) 会是更好的选择。
  • 它正在尝试查找不存在的“开始”文件。这在您的系统中存在吗?
  • "start"是cmd实现的命令。所以你想要的可能是一个命令行“cmd .....”。但是你为什么需要“开始”呢?

标签: java file process io


【解决方案1】:

命令start是Windows CMD.EXE内置的,所以不能直接调用,因为它不是可执行文件,所以你必须先调用CMD.EXE,例如:

String[] cmd = new String[] {"cmd.exe", "/c", "start "+PATH + "SideProjs"};
Process process = Runtime.getRuntime().exec(cmd);

还有其他方法可以在 cmets 中打开新的文件资源管理器窗口(如果支持 BROWSE_FILE_DIR 操作)或尝试:

Desktop.getDesktop().open(new File(PATH+"SideProjs"));

或者如果 PATH 是一个目录:

Desktop.getDesktop().open(new File(PATH, "SideProjs"));

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2016-08-20
    • 1970-01-01
    • 2018-10-05
    • 1970-01-01
    • 1970-01-01
    • 2012-01-14
    • 2022-10-23
    • 2020-02-21
    相关资源
    最近更新 更多