版权声明:本文为博主原创文章。未经博主同意不得转载。 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. Python之NumPy(axis=0 与axis=1)区分

    转自:http://blog.csdn.net/wangying19911991/article/details/73928172 https://www.zhihu.com/question/589 ...

  2. C# - Generics泛型,一图话c#泛型

    一.一篇好文 https://www.cnblogs.com/yueyue184/p/5032156.html 二.一幅好图

  3. 使用 C++ 多态时需要注意的问题

    本文为大便一箩筐的原创内容,转载请注明出处,谢谢:http://www.cnblogs.com/dbylk/ 最近工作中遇到一些关于使用多态的细节问题,在此记录一下. 一.多态和模板匹配 模板是 C+ ...

  4. RxJava 详解

    给 Android 开发者的 RxJava 详解: http://gank.io/post/560e15be2dca930e00da1083#toc_1

  5. 添加git 忽略文件

    在使用Git的过程中,我们喜欢有的文件比如日志,临时文件,编译的中间文件等不要提交到代码仓库,这时就要设置相应的忽略规则,来忽略这些文件的提交. Git 忽略文件提交的方法 有三种方法可以实现忽略Gi ...

  6. LeetCode OJ:Longest Increasing Subsequence(最长递增序列)

    Given an unsorted array of integers, find the length of longest increasing subsequence. For example, ...

  7. asp.net string有多行文字

    用如下格式设置

  8. Java调用本地方法又是怎么一回事

    JNI JNI即Java Native Interface,它能在Java层实现对本地方法的调用,一般本地的实现语言主要是C/C++,其实从虚拟机层面来看JNI挺好理解,JVM主要使用C/C++ 和少 ...

  9. [置顶] Isolation Forest算法原理详解

    本文只介绍原论文中的 Isolation Forest 孤立点检测算法的原理,实际的代码实现详解请参照我的另一篇博客:Isolation Forest算法实现详解. 或者读者可以到我的GitHub上去 ...

  10. zookeeper 学习命令

    ls /TianheSoft/nodesls /TianheSoft/nodes/localhost_2181-0000000000ls /TianheSoft/propsls /TianheSoft ...