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

本文共 4608 字,大约阅读时间需要 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();		}	}}

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

附上地址:

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

你可能感兴趣的文章
架设用Webservice实现文件上传功能CentOS服务器(一)--Tomcat
查看>>
一步一步部署Laravel项目
查看>>
.net 2.0 4.0 表单中危险字符
查看>>
dubbo负载均衡策略
查看>>
玩转大数据系列之Apache Pig如何通过自定义UDF查询数据库(五)
查看>>
axis实例包
查看>>
归并排序 MergeSort
查看>>
Javascript的this用法
查看>>
Fiddler下Firefox提示“您的连接并不安全”的解决办法
查看>>
mint 安装emacs 24.3源码安装
查看>>
性能细节1
查看>>
解决mysql图形管理器乱码问题
查看>>
mysql :error while loading shared libraries: libaio.so.1: cannot open shared object file:
查看>>
使用FUSE挂载HDFS流程及错误集锦
查看>>
SQL转换为日期的做法
查看>>
安装python模块paramkio报错 error: command 'gcc' failed with exit status 1
查看>>
1.1Python快速入门
查看>>
HTML5 canvas 标签介绍:定义图形
查看>>
界面编程-2
查看>>
Android系统的开机画面显示过程分析(1)
查看>>