版权声明:本文为博主原创文章。未经博主同意不得转载。 https://blog.csdn.net/xmt1139057136/article/details/25620685

程序猿都非常懒。你懂的!

近期在项目开发中,由cs开发的exe的程序。须要自己主动升级,该exe程序放在linux下。自己主动升级时检測不到该exe程序的版本号号信息,可是我们client的exe程序须要获取server上新程序的版本号号信息。

最后由我用java实现linux上exe文件的版本号号读取功能。以下是具体代码:

package com.herman.utils;

import java.io.File;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.io.RandomAccessFile;
/**
* @see 获取文件信息的工具类
* @author Herman.Xiong
* @date 2014年5月12日 15:01:26
* @version V1.0
* @since tomcat 6.0 , jdk 1.6
*/
public class FileUtil {
/**
* @see 获取版本号信息
* @param filePath
* @return
*/
public static String getVersion(String filePath) {
File file = new File(filePath);
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 numDirs = unpack(new byte[] { buffer[14], buffer[15] });
boolean infoFound = false;
int subOff = 0;
for (int i = 0; i < numDirs; 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] });
System.out.println(version2 + "." + version1 + "." + version4 + "."
+ version3);
return version2 + "." + version1 + "." + version4 + "." + version3;
} catch (FileNotFoundException e) {
return null;
} catch (IOException e) {
return null;
} finally {
if (raf != null) {
try {
raf.close();
} catch (IOException e) {
}
}
}
} 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;
}
}

执行效果图(window上和linux的filePath自己改正正确就可以):

点击下载具体的演示项目http://download.csdn.net/detail/xmt1139057136/7335155

怎样在windows下和linux下获取文件(如exe文件)的具体信息和属性的更多相关文章

  1. socket在windows下和linux下的区别

    原文:socket在windows下和linux下的区别 1)头文件 windows下winsock.h/winsock2.h linux下sys/socket.h    错误处理:errno.h 2 ...

  2. 在Windows及Linux下获取毫秒级运行时间的方法

    在Windows下获取毫秒级运行时间的方法 头文件:<Windows.h> 函数原型: /*获取时钟频率,保存在结构LARGE_INTEGER中***/ WINBASEAPI BOOL W ...

  3. docker在windows下和linux下网络底层的一些区别

    windows和linux下的docker运行时的网络结构是有区别的 a.windows下,默认使用Hyper-v创建一个linux虚拟机,承载docker.所以从外向内的路径为: windows - ...

  4. linux下安装QQ等EXE文件

    安装好linux系统后,发现linux很多自带的软件用起来很不习惯,于是去网上下载QQ等在Windows下经常使用的exe文件. 发现这些文件无法安装,在网上找了一些解决办法,须下载wine,然后才可 ...

  5. windows下和linux下 Redis 安装

    Redis 是一个高性能的key-value数据库, 使用内存作为主存储,数据访问速度非常快,当然它也提供了两种机制支持数据持久化存储.比较遗憾的是,Redis项目不直接支持Windows,Windo ...

  6. windows、linux下通过ftp上传文件小脚本

    一.windows @echo off #open ip 将要上传文件的IP地址echo open IP>ftp.up #用户名echo ninic>>ftp.up #密码echo ...

  7. windows下和linux下libcurl安装

    下载源代码,在winbuild里面有个说明文件: Building with Visual C++, prerequisites==================================== ...

  8. Mysql在windows下和linux下对表名大小写默认要求的一个细节

    今天在虚拟机里搭建项目环境,偷了下懒,直接把本机数据库中的表用sqlyog复制给虚拟机中的数据库,然后开始部署项目,项目一启动提示: Table 'sdmqrt.QRTZ_LOCKS' doesn't ...

  9. netstat 在windows下和Linux下查看网络连接和端口占用

    假设忽然起个服务,告诉我8080端口被占用了,OK,我要去看一下是什么服务正在占用着,能不能杀 先假设我是在Windows下: 第一列: Proto 协议 第二列: 本地地址[ip+端口] 第三列:远 ...

随机推荐

  1. IdentityServer4在Asp.Net Core中的应用(三)

    今天的内容是授权模式中的简化模式,还是先看以下授权流程图: 在这种模式中我们将与OpenID结合使用,所以首先我们要了解OpenID和OAuth的区别,关于他们的区别,在我上一篇博客<理解Ope ...

  2. C#多线程3种创建Thread、Delegate.BeginInvoke、线程池

    1   创建多线程,一般情况有以下几种:(1)通过Thread类   (2)通过Delegate.BeginInvoke方法   (3)线程池 using System; using System.C ...

  3. 二十一 Python分布式爬虫打造搜索引擎Scrapy精讲—爬虫数据保存

    注意:数据保存的操作都是在pipelines.py文件里操作的 将数据保存为json文件 spider是一个信号检测 # -*- coding: utf-8 -*- # Define your ite ...

  4. brew || yarn 软件包管理工具

    1.brew || yarn 软件包管理工具

  5. Pandas:SettingWithCopyWarning

    当我为数据增加新的列的时候,Pandas一直报错:SettingWithCopyWarning 这个问题没有很好地解决方法,因为这个问题也无关大碍,不让Pandas报错就行了. 解决方法: pd.op ...

  6. 十四、dbms_obfuscation_toolkit(用于加密和解密应用数据)

    1.概述 作用:用于加密和解密应用数据,另外还可以生成密码检验和.通过加密输入数据,可以防止黑客或其他用户窃取私有数据;而通过结合使用加密和密码检验和,可以防止黑客破坏初加密的数据.当使用该包加密数据 ...

  7. Prism 4 文档 ---第3章 管理组件间的依赖关系

     基于Prism类库的应用程序可能是由多个松耦合的类型和服务组成的复杂应用程序,他们需要根据用户的动作发出内容和接收通知进行互动,由于他们是松耦合的,他们需要一种方式来互动和交流来传递业务功能的需求. ...

  8. js的 style.width 取不到元素的宽度值

    以前一直用jquery的.width()方法来获取一个元素的当前的宽度.不管该元素是否设置了宽度,CSS样式是内联.外联or内嵌,都可用此方式获得元素当前的宽度. 今天想用原生JS想获取一个元素宽度时 ...

  9. iOS开发探索-高斯模糊&毛玻璃效果

    iOS开发中有的时候需要将图片设置模糊,来实现特定的效果获取更好的用户体验, iOS7之后半透明模糊效果得到大范围使用的比较大,现在也可以看到很多应用局部用到了图片模糊效果,可以通过高斯模糊和毛玻璃效 ...

  10. Ubuntu 14.10安装simplescalar

    经过两天的安装,终于把simplescalar安装成功,安装过程中在网上找了很多资料,但是很多都是关于低版本ubuntu安装的过程,而且按照这些教程也没有安装成功,来记录一下安装中出现的问题及解决方案 ...