gpt4 book ai didi

java - 在 Linux 上用 java 获取 .exe 的文件版本

转载 作者:太空宇宙 更新时间:2023-11-04 05:09:43 24 4
gpt4 key购买 nike

问题 - 在 Linux 上为某些奇怪的客户端获取 .exe 的文件版本。

解决方案 -

我使用 JNA 库来使用 Java 读取文件版本。下面给出的代码在 Windows 平台上运行良好,但在 Linux docker 镜像上抛出以下错误。

“无法加载库'version':加载共享库libversion.so时出错:没有这样的文件或目录加载共享库libversion.so时出错:没有这样的文件或目录在资源路径中找不到 native 库(linux-x86-64/libversion.so)..”。

private String GetFileVersion(String filePath) {

File fileToCheck = new File(filePath);
short[] rtnData = new short[4];


int infoSize = Version.INSTANCE.GetFileVersionInfoSize(fileToCheck.getAbsolutePath(), null);
Pointer buffer = Kernel32.INSTANCE.LocalAlloc(WinBase.LMEM_ZEROINIT, infoSize);

try {

Version.INSTANCE.GetFileVersionInfo(fileToCheck.getAbsolutePath(), 0, infoSize, buffer);
IntByReference outputSize = new IntByReference();
PointerByReference pointer = new PointerByReference();
Version.INSTANCE.VerQueryValue(buffer, "\\", pointer, outputSize);
VerRsrc.VS_FIXEDFILEINFO fileInfoStructure = new VerRsrc.VS_FIXEDFILEINFO(pointer.getValue());

rtnData[0] = (short) (fileInfoStructure.dwFileVersionMS.longValue() >> 16);
rtnData[1] = (short) (fileInfoStructure.dwFileVersionMS.longValue() & 0xffff);
rtnData[2] = (short) (fileInfoStructure.dwFileVersionLS.longValue() >> 16);
rtnData[3] = (short) (fileInfoStructure.dwFileVersionLS.longValue() & 0xffff);

return String.format("%s.%s.%s.%s", rtnData[0], rtnData[1], rtnData[2], rtnData[3]);

} catch (Exception exception) {

return null;

} finally {
Kernel32.INSTANCE.GlobalFree(buffer);
}
}

最佳答案

我将首先回答您提出的问题,尽管我怀疑这是否是您真正需要知道的。

不同可执行文件格式的类型编码在文件的前几个字节中。例如,ELF 文件(可执行文件、共享库)在 this 中进行了描述。维基百科页面。

因此,有多种方法可以找出 Java 中的可执行文件类型:

  1. 编写一些代码来读取前几个字节并解码文件头信息,按照上面维基百科链接中描述的格式。
  2. 找到一个可以执行此操作的现有 Java 库并找出如何执行此操作。 (Google 搜索“java 文件魔法库”,看看能找到什么。)
  3. 了解 Linux file 命令并编写一些 Java 代码以在每个库上运行 file 并解析输出。
<小时/>

我认为您实际上需要做的有点不同:

  1. 在文件系统中找到 Java 正在查找的一个或多个文件:显然是 libversion.solinux-x86-64/libversion.so。 (该文件很可能是一个符号链接(symbolic link)。请遵循它。)
  2. 对每个文件运行 file 以检查它是否是正确类型的库。它们必须是 32 位或 64 位与您正在运行的 JVM 相对应,以及适合该平台的正确 ABI 和 ISA。
  3. 检查这些文件是否位于 JVM 期望找到的位置。 JVM 在“java.library.path”系统属性中列出的目录中搜索库。您可以(如有必要)使用 -Djava.library.path=... JVM 选项设置路径。

参见"java.library.path – What is it and how to use"有关库加载的更多信息。

(绝对不需要“从”或“在”Java 中执行第 2 步。)

关于java - 在 Linux 上用 java 获取 .exe 的文件版本,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56970252/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com