获取 .exe 的版本信息
有谁知道如何通过 Java 获取可执行文件/文件的版本信息。情况是,我的本地系统上有一个文件,如果服务器上的版本比我系统上的版本更新,我需要从服务器下载该文件。
Does anybody know how got get the version info for a executable/file via Java. The scenario is that I have a file on my local system and if the version on the server is newer then the one on my system I need to download the file from the server.
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(7)
经过几个小时的在线编码后,我找到了一个使用 JNA 获取文件版本信息的解决方案。
After spending hours online and coding I found a solution using JNA to get the Version Information for a file.
作为参考,GEverding 的代码修改版本,带有 JNA 4,使用 com.sun.jna.platform.win32
For reference, a modified version of the code by GEverding, with JNA 4, using com.sun.jna.platform.win32
由于可移植性问题,我相信此类信息在 java 中实际上不可用,除非您使用不太可移植的方法访问它。
例如,您可以使用 JNI 和 C++ 编写包装器,并使用 GetFileVersionInfo API(另请参阅这个 JavaWorld 提示) 可以从 Windows 的 exe 中获取此类信息。另一种方法是使用完全外部的应用程序来输出文件的版本,并使用 Runtime 类创建进程并与该应用程序交互。
其他方法需要访问服务器并从服务器端提供版本检查:
Due to portability issues I believe this kind of information is not actually available in java unless you access it using a less portable approach.
For example you could write a wrapper using JNI and C++ and use the GetFileVersionInfo API (see also this JavaWorld tip) of Windows to get that kind of information from the exe. Another approach would be to use a totally external application that outputs the version of the file and use the Runtime class to create a process and interact with that application.
Other approaches would require having access to the server and providing version checking from server side:
如果您指的是 Windows 上的“属性”->“详细信息”中获得的信息,请记住它依赖于平台!话虽如此,SIGAR 具有 Java 绑定和 FileVersionInfo 类看起来很接近您的需要。
If you mean the information you get in Property->Details on Windows, bear in mind that it's platform dependent! That being said SIGAR has Java bindings and a FileVersionInfo class that seems close to what you need.
我修改了 Antonis Zafiropoulos 的答案,并制作了一个方便的课程,您可以将其放入您的项目中。请注意,fileInfoResult 和 verQueryVal 行必须存在,即使它们似乎没有执行任何操作。
I modified Antonis Zafiropoulos's answer and made a handy class you can just drop into your project. Note that the fileInfoResult and verQueryVal lines must exist even though they don't appear to do anything.
有一个便携式解决方案此处解释(这个问题或多或少是重复的)。
基本上,Windows 可执行文件使用 PE 格式(以及 Linux 的 ELF),您可以使用 pecoff4j 库 来以便携式方式阅读此信息。
There is a portable solution explained here (and this question is more or less a duplicate).
Basically, windows executable use the PE format (and linux ones ELF) and you can use the pecoff4j library to read this information in a portable way.
如果是 Windows 程序,请使用 powershell。
该位获取文件版本。
一并完成:
Shell out to powershell if it's a windows program.
This bit gets the file version.
One and done: