【问题标题】:Obtain path to program associated with a file获取与文件关联的程序的路径
【发布时间】:2019-08-31 22:26:57
【问题描述】:

给定一个文件,我想在 Java 中提出一种编程方式来获取与该文件关联的 exe 的路径(这是 Windows)。我这样做是因为我想从我自己的应用程序中启动另一个应用程序。我还需要知道文件何时关闭,以便更新应用中的数据。

目前它通过使用进程来工作,但我已经硬编码了 exe 的路径,所以看起来这是缺少的部分。我几乎可以肯定我应该在注册表中查看该信息,但在 Computer\HKEY_CLASSES_ROOT{fileExt} 下我只能看到一个名为 ShellEx 的文件夹,其中有两个奇怪的值,例如 {2EC1BE78-0401-44B1-87EF-1A5966D5C5D0 }。关于如何进行的任何建议?

【问题讨论】:

    标签: java windows file registrykey


    【解决方案1】:

    在 Windows 中,可以使用命令行命令 ftypeassoc 检索,如下例所示:

    Prompt>assoc .docx
    .docx=Word.Document.12
    
    Prompt>ftype Word.Document.12
    Word.Document.12="C:\Program Files (x86)\Microsoft Office\Root\Office16\WINWORD.EXE" /n "%1" /o "%u"
    

    所以问题归结为如何在 Java 中启动命令行命令并读取其结果。应该有很多关于这个的帖子(一个简单的谷歌引导我到this URL)。

    【讨论】:

    • 这似乎正是我想要的,谢谢!
    【解决方案2】:

    为什么不用Desktop.open()在关联的原生应用中打开文件,比如你要打开的文件是c:\somefile.png,在关联的应用中打开就很简单了

     Desktop desk = Desktop.getDesktop();
     desk.open(new File("c:/somefile.png"));
    

    至于其他部分,您可以使用 Java Watch 服务 API 来确定文件在打开时是否更改。

    https://www.baeldung.com/java-nio2-watchservice

    https://howtodoinjava.com/java8/java-8-watchservice-api-tutorial/

    作为替代方案,Apache Commons IO 中还有文件监视器 https://commons.apache.org/proper/commons-io/

    可以在这里找到两者的小比较: https://www.baeldung.com/java-watchservice-vs-apache-commons-io-monitor-library

    【讨论】:

    • 感谢您的回答。这可能可行,但需要对现有代码进行一些重构,因为它使线程等待进程完成,我希望避免进行太多更改。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-11-14
    • 1970-01-01
    • 2011-06-18
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多