博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
如何获得运行在跨平台的信息和属性的情况下,文件
阅读量:4359 次
发布时间:2019-06-07

本文共 4659 字,大约阅读时间需要 15 分钟。

很多情况下,我们需要得到该系统的版本号可以运行该文件数。为了做一些额外的动作!实际上可使用jna获得,是这将依赖人家,所以还是Java自己来吧!好啦。直接上代码吧
/** * @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();		}	}}

真的非常赞。效果美极了!

附上地址:

版权声明:本文博客原创文章。博客,未经同意,不得转载。

转载于:https://www.cnblogs.com/mfrbuaa/p/4736342.html

你可能感兴趣的文章
由当前日期计算相应的周一和周日
查看>>
Silverlight Excel Release process
查看>>
Python(xlrd、xlwt模块)操作Excel实例(一)
查看>>
ZOJ Monthly, November 2012 - G - Gao The Sequence
查看>>
react dnd demo2
查看>>
洛谷——P1896 [SCOI2005]互不侵犯
查看>>
Java之String
查看>>
20155212 2017-2018-1 《信息安全系统设计》第7周学习总结
查看>>
新手C#ListView使用记录2018.08.03
查看>>
1028: 可乐(2018年中南大学研究生复试机试题 )
查看>>
珍藏的最全的windows操作系统快捷键
查看>>
【DBAplus】SQL优化:一篇文章说清楚Oracle Hint的正确使用姿势
查看>>
二叉树结点删除操作
查看>>
图论-单源最短路-SPFA算法
查看>>
转换文件的字符集
查看>>
prometheus + grafana安装部署(centos6.8)
查看>>
Redis和Memcached的区别【转】
查看>>
VMware: Deploy multiple VM’s from template with PowerCLI
查看>>
Cascaded pose regression
查看>>
model,map,MapAndVivew用于页面跳转时候使用的即跳转后才添加属性 这样再回调中无法使用 因为回调的前提是页面不调转;解决的方法是用responsewrite(普通的字符响应)...
查看>>