获取与文件关联的程序的路径

Obtain path to program associated with a file

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

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

在 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 中启动命令行命令并读取其结果。应该有很多关于这个的帖子(一个简单的 Google 让我 this URL)。

为什么不用Desktop.open()在关联的本机应用程序中打开文件,比如你要打开的文件是c:\somefile.png,在关联的应用程序中打开它很简单

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

至于另一部分,您可以使用 Java 监视服务 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