/**
* @Description:
*
* @Title: FileInfoUtil.java
* @Package com.joyce.util
* @Copyright: Copyright (c) 2014
*
* @author Comsys-LZP
* @date 2014-5-12 下午03:46:32
* @version V2.0
*/
package com.joyce.util;
import java.io.File;
import java.io.RandomAccessFile;
/**
* @Description:文件操作工具类
*
* @ClassName: FileInfoUtil
* @Copyright: Copyright (c) 2014
*
* @author Comsys-LZP
* @date 2014-5-12 下午03:46:32
* @version V2.0
*/
public class FileInfoUtil {
/**
* @Description: 获取文件版本信息
*
* @param file
* @return
*
* @Title: FileInfoUtil.java
* @Copyright: Copyright (c) 2014
*
* @author Comsys-LZP
* @date 2014-5-12 下午04:36:17
* @version V2.0
*/
public static String getVersion(File file) {
RandomAccessFile raf = null;
byte[] buffer;
String str;
try {
raf = new RandomAccessFile(file, "r");
buffer = new byte[64];
raf.read(buffer);
str = "" + (char) buffer[0] + (char) buffer[1];
if (!"MZ".equals(str)) {
return null;
}
int peOffset = unpack(new byte[] { buffer[60], buffer[61],
buffer[62], buffer[63] });
if (peOffset < 64) {
return null;
}
raf.seek(peOffset);
buffer = new byte[24];
raf.read(buffer);
str = "" + (char) buffer[0] + (char) buffer[1];
if (!"PE".equals(str)) {
return null;
}
int machine = unpack(new byte[] { buffer[4], buffer[5] });
if (machine != 332) {
return null;
}
int noSections = unpack(new byte[] { buffer[6], buffer[7] });
int optHdrSize = unpack(new byte[] { buffer[20], buffer[21] });
raf.seek(raf.getFilePointer() + optHdrSize);
boolean resFound = false;
for (int i = 0; i < noSections; i++) {
buffer = new byte[40];
raf.read(buffer);
str = "" + (char) buffer[0] + (char) buffer[1]
+ (char) buffer[2] + (char) buffer[3]
+ (char) buffer[4];
if (".rsrc".equals(str)) {
resFound = true;
break;
}
}
if (!resFound) {
return null;
}
int infoVirt = unpack(new byte[] { buffer[12], buffer[13],
buffer[14], buffer[15] });
int infoSize = unpack(new byte[] { buffer[16], buffer[17],
buffer[18], buffer[19] });
int infoOff = unpack(new byte[] { buffer[20], buffer[21],
buffer[22], buffer[23] });
raf.seek(infoOff);
buffer = new byte[infoSize];
raf.read(buffer);
int nameEntries = unpack(new byte[] { buffer[12], buffer[13] });
int idEntries = unpack(new byte[] { buffer[14], buffer[15] });
boolean infoFound = false;
int subOff = 0;
for (int i = 0; i < (nameEntries + idEntries); i++) {
int type = unpack(new byte[] { buffer[i * 8 + 16],
buffer[i * 8 + 17], buffer[i * 8 + 18],
buffer[i * 8 + 19] });
if (type == 16) { // FILEINFO resource
infoFound = true;
subOff = unpack(new byte[] { buffer[i * 8 + 20],
buffer[i * 8 + 21], buffer[i * 8 + 22],
buffer[i * 8 + 23] });
break;
}
}
if (!infoFound) {
return null;
}
subOff = subOff & 0x7fffffff;
infoOff = unpack(new byte[] { buffer[subOff + 20],
buffer[subOff + 21], buffer[subOff + 22],
buffer[subOff + 23] }); // offset of first FILEINFO
infoOff = infoOff & 0x7fffffff;
infoOff = unpack(new byte[] { buffer[infoOff + 20],
buffer[infoOff + 21], buffer[infoOff + 22],
buffer[infoOff + 23] }); // offset to data
int dataOff = unpack(new byte[] { buffer[infoOff],
buffer[infoOff + 1], buffer[infoOff + 2],
buffer[infoOff + 3] });
dataOff = dataOff - infoVirt;
int version1 = unpack(new byte[] { buffer[dataOff + 48],
buffer[dataOff + 48 + 1] });
int version2 = unpack(new byte[] { buffer[dataOff + 48 + 2],
buffer[dataOff + 48 + 3] });
int version3 = unpack(new byte[] { buffer[dataOff + 48 + 4],
buffer[dataOff + 48 + 5] });
int version4 = unpack(new byte[] { buffer[dataOff + 48 + 6],
buffer[dataOff + 48 + 7] });
return version2 + "." + version1 + "." + version4 + "." + version3;
} catch (Exception e) {
return null;
} finally {
if (raf != null) {
try {
raf.close();
} catch (Exception e) {
e.printStackTrace();
}
}
}
}
public static int unpack(byte[] b) {
int num = 0;
for (int i = 0; i < b.length; i++) {
num = 256 * num + (b[b.length - 1 - i] & 0xff);
}
return num;
}
public static void main(String[] args) {
try {
// String filePath = "D:\\Program Files (x86)\\Wiz\\Wiz.exe";
String filePath = "D:\\Program Files (x86)\\360\\360Chrome\\Chrome\\Application\\360chrome.exe";
File file = new File(filePath);
System.out.println("软件版本号:" + getVersion(file));
} catch (Exception e) {
e.printStackTrace();
}
}
}
效果真的可以哟!
附上完整文件资源下载地址:http://download.csdn.net/download/luo201227/7336013
如何在跨平台的情况下获取可执行文件的详细信息和属性,布布扣,bubuko.com
原文:http://blog.csdn.net/luo201227/article/details/25638735