java - 如何获取 Windows 文件详细信息?

标签 java windows file

我想获取 exe/dll/sys 文件的“文件描述”和“版权”,如右键单击文件并选择属性时“详细信息”选项卡中所示。

最佳答案

使用 Windows API,您可以调用 VerQueryValue获取该信息。 JNA有一个用于访问此 API 的类,名为 Version .

这个问题有一些代码示例可以帮助您入门:

Get Version Info for .exe

这个有一个读取产品名称的 C 代码示例,您可以将其翻译成 JNA:

How do I read from a version resource in Visual C++

这显然只适用于 Windows。如果你想要一些便携的东西,你可以使用 pecoff4j自行解析可执行文件。它声称能够解析PE(Portable Executable)资源部分的版本信息。


似乎pecoff4j 不支持解析版本字符串,所以我forked it on GitHub添加对它的支持。这段代码现在应该可以工作了:

import java.io.IOException;

import org.boris.pecoff4j.PE;
import org.boris.pecoff4j.ResourceDirectory;
import org.boris.pecoff4j.ResourceEntry;
import org.boris.pecoff4j.constant.ResourceType;
import org.boris.pecoff4j.io.PEParser;
import org.boris.pecoff4j.io.ResourceParser;
import org.boris.pecoff4j.resources.StringFileInfo;
import org.boris.pecoff4j.resources.StringTable;
import org.boris.pecoff4j.resources.VersionInfo;
import org.boris.pecoff4j.util.ResourceHelper;

public class Main {

    public static void main(String[] args) throws IOException {
        PE pe = PEParser.parse("C:/windows/system32/notepad.exe");
        ResourceDirectory rd = pe.getImageData().getResourceTable();

        ResourceEntry[] entries = ResourceHelper.findResources(rd, ResourceType.VERSION_INFO);
        for (int i = 0; i < entries.length; i++) {
            byte[] data = entries[i].getData();
            VersionInfo version = ResourceParser.readVersionInfo(data);

            StringFileInfo strings = version.getStringFileInfo();
            StringTable table = strings.getTable(0);
            for (int j = 0; j < table.getCount(); j++) {
                String key = table.getString(j).getKey();
                String value = table.getString(j).getValue();
                System.out.println(key + " = " + value);
            }
        }
    }

}

它将打印您需要的所有信息:

CompanyName = Microsoft Corporation
FileDescription = Notepad
FileVersion = 6.1.7600.16385 (win7_rtm.090713-1255)
InternalName = Notepad
LegalCopyright = © Microsoft Corporation. All rights reserved.
OriginalFilename = NOTEPAD.EXE
ProductName = Microsoft® Windows® Operating System
ProductVersion = 6.1.7600.16385

关于java - 如何获取 Windows 文件详细信息?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23845480/

相关文章:

java - 为什么这个 Kotlin 类属性不公开?

c# - Reg-Free COM "Microsoft.Windows.ActCtx"是否适用于脚本 - 后期绑定(bind)?

windows - 如何在没有 visual studio 的情况下运行 windows phone 8 模拟器?

c - 具有多线程功能的 sendarp 不适用于整个子网(wifi 环境)

java - 将上下文(CDI/servlet)注入(inject)新的 FutureTask 线程

java - 如何访问 forEach 内部 lambda 之外的对象?

java - 在我的例子中生成随机字符

c++ - std::ifstream 将文件读取为 BYTE(unsigned char)而非 char

c# - 上传时网络客户端超时

file - Erlang,如何创建带有换行符的文本文件?