package file.extendsion;

import java.io.ByteArrayOutputStream;
import java.io.File;
import java.io.FileInputStream; public class LnkParser { // http://www.oschina.net/code/snippet_12_274
public static void main(String[] args) throws Exception {
new LnkParser(new File("e:/eclipse.lnk"));
} public LnkParser(File f) throws Exception {
parse(f);
} private boolean is_dir; public boolean isDirectory() {
return is_dir;
} private String real_file; public String getRealFilename() {
return real_file;
} public void parse(File f) throws Exception {
// read the entire file into a byte buffer
FileInputStream fin = new FileInputStream(f);
ByteArrayOutputStream bout = new ByteArrayOutputStream();
byte[] buff = new byte[256];
while (true) {
int n = fin.read(buff);
if (n == -1) {
break;
}
bout.write(buff, 0, n);
}
fin.close();
byte[] link = bout.toByteArray(); // get the flags byte
byte flags = link[0x14]; // get the file attributes byte
final int file_atts_offset = 0x18;
byte fileatts = link[file_atts_offset];
byte is_dir_mask = (byte) 0x10;
if ((fileatts & is_dir_mask) > 0) {
is_dir = true;
} else {
is_dir = false;
} // if the shell settings are present, skip them
final int shell_offset = 0x4c;
int shell_len = 0;
if ((flags & 0x1) > 0) {
// the plus 2 accounts for the length marker itself
shell_len = bytes2short(link, shell_offset) + 2;
} // get to the file settings
int file_start = 0x4c + shell_len; // get the local volume and local system values
int local_sys_off = link[file_start + 0x10] + file_start;
real_file = getNullDelimitedString(link, local_sys_off);
p("real filename = " + real_file);
} static String getNullDelimitedString(byte[] bytes, int off) {
int len = 0;
// count bytes until the null character (0)
while (true) {
if (bytes[off + len] == 0) {
break;
}
len++;
}
return new String(bytes, off, len);
} // convert two bytes into a short // note, this is little endian because
// it's for an // Intel only OS.
static int bytes2short(byte[] bytes, int off) {
return bytes[off] | (bytes[off + 1] << 8);
} /*
* static int norm(byte b) { if(b < 0) { b+=128; } return b; } static int
* bytes2int(byte[] arr, int off) { int b1 = norm(arr[off]); int b2 =
* norm(arr[off+1]); int b3 = norm(arr[off+2]); int b4 = norm(arr[off+3]);
* int val = ( (b1 << 0) | (b2 << 8) | (b3 << 16) | (b4 << 24) );
* //p("bytes2int: " + b1 + " " + b2 + " " + b3 + " " + b4); return val; }
*
*
* static NumberFormat num_format = new DecimalFormat(" 000;-000");
*
* public static String padd(String str, int len) { while(str.length() <
* len) { str = " " + str; } return str; }
*
* public static void pw(byte[] arr, int off) { StringBuffer top = new
* StringBuffer(); StringBuffer mid = new StringBuffer(); StringBuffer bot =
* new StringBuffer(); top.append("--"); mid.append(" "); bot.append(" ");
*
* for(int i=0; i<16; i++) { int val = arr[off+i]; String str =
* Integer.toHexString(off+i); top.append(padd(str,5));
* mid.append(padd(""+val,5)); if(val < 0) { val += 128; } if(val >= ' ' &&
* val <= '~') { str = "" + (char)val; } else { str =
* Integer.toHexString(val); } str = padd(str,5); bot.append(str);
* if(i%4==3) { top.append(" "); mid.append(" "); bot.append(" ");
* } } p(top.toString()); p(mid.toString()); p(bot.toString()); } public
* static void pbits(byte bt) { p("byte = " + bt + " " +
* Integer.toHexString(bt) + " " + Integer.toBinaryString(bt)); }
*/ public static void p(String str) {
System.out.println(str);
}
}

http://www.oschina.net/code/snippet_12_274

Java 解析 lnk 快捷方式文件的方法(转)的更多相关文章

  1. java解析xml的三种方法

    java解析XML的三种方法 1.SAX事件解析 package com.wzh.sax; import org.xml.sax.Attributes; import org.xml.sax.SAXE ...

  2. 【Java】详解Java解析XML的四种方法

    XML现在已经成为一种通用的数据交换格式,平台的无关性使得很多场合都需要用到XML.本文将详细介绍用Java解析XML的四种方法. AD: XML现在已经成为一种通用的数据交换格式,它的平台无关性,语 ...

  3. Java解析XML的四种方法详解 - 转载

    XML现在已经成为一种通用的数据交换格式,平台的无关性使得很多场合都需要用到XML.本文将详细介绍用Java解析XML的四种方法 在做一般的XML数据交换过程中,我更乐意传递XML字符串,而不是格式化 ...

  4. java中读取资源文件的方法

    展开全部 1.使用java.util.Properties类的load()方法 示例: //文件在项目下.不是在包下!! InputStream in = new BufferedInputStrea ...

  5. JAVA解析XML的四种方法

    XML文件:test.xml <?xml version="1.0" encoding="UTF-8"?> <employees> &l ...

  6. Java 解析XML的几种方法

    XML现在已经成为一种通用的数据交换格式,它的平台无关性,语言无关性,系统无关性,给数据集成与交互带来了极大的方便. XML在不同的语言里解析方式都是一样的,只不过实现的语法不同而已. 基本的解析方式 ...

  7. java读写Properties属性文件公用方法

    Java中有个比较重要的类Properties(Java.util.Properties),主要用于读取Java的配置文件. 它提供了几个主要的方法: 1. getProperty ( String ...

  8. 详解Java解析XML的四种方法

    XML现在已经成为一种通用的数据交换格式,它的平台无关性,语言无关性,系统无关性,给数据集成与交互带来了极大的方便.对于XML本身的语法知识与技术细节,需要阅读相关的技术文献,这里面包括的内容有DOM ...

  9. [转]详解Java解析XML的四种方法

    XML现在已经成为一种通用的数据交换格式,它的平台无关性,语言无关性,系统无关性,给数据集成与交互带来了极大的方便.对于XML本身的语法知识与技术细节,需要阅读相关的技术文献,这里面包括的内容有DOM ...

随机推荐

  1. TMG 2010 VPN配置

    微软的ISA 到2006以后就叫TMG了,上周在公司的服务器上安装测试了下,虽然增加了很多功能,但是主要功能上和ISA 2004差不多,最近在部署L2TP VPN,由于防火墙带的远程访问VPN为纯的L ...

  2. fiddler4使用教程(转)

    Fiddler的基本介绍 Fiddler的官方网站:  www.fiddler2.com Fiddler官方网站提供了大量的帮助文档和视频教程, 这是学习Fiddler的最好资料. Fiddler是最 ...

  3. 用XAML做网页!!—导航栏

    原文:用XAML做网页!!-导航栏 这次要完成的是导航栏,这是页面中比较复杂的区域. 先在 Microsoft Expression Design 中绘制导航栏的背景图案: 导出为barback.xa ...

  4. zoj - 3209 - Treasure Map(精确覆盖DLX)

    题意:一个 n x m 的矩形(1 <= n, m <= 30),现给出这个矩形中 p 个(1 <= p <= 500)子矩形的左下角与右下角坐标,问最少用多少个子矩形能够恰好 ...

  5. wamp5中的apache不能启动,80端口被占用

    在wamp中apache中的httpd.conf文件中 端口文件设置为8080 #Listen 12.34.56.78:8080Listen 8080

  6. 在centos上部署java WEB环境

    题语:偷得浮生半日闲,趁着十一期间,好好的写写随笔来记录自己所学.所践和所得,不足之处,欢迎各位拍砖~~~ 工具:Xftp 5.Xshell 5 一.安装jdk  1. 使用Xftp 5把jdk-8u ...

  7. spring.net中间IoC、DI和MVC

    轮廓 spring.net它是开源的业务层框架,功能很强大,它归结到什么都有3能:面向切面编程:IoC和DI:提供综合型的框架支持,本片博客主要说一下IoC和DI.和其提供的对MVC框架的支持. Io ...

  8. poj 1789 Truck History(kruskal算法)

    主题链接:http://poj.org/problem?id=1789 思维:一个一个点,每两行之间不懂得字符个数就看做是权值.然后用kruskal算法计算出最小生成树 我写了两个代码一个是用优先队列 ...

  9. HTTP相关概念

    最近观看HTTP权威指南.这本书是一个小更,欲了解更多详细信息,我们不能照顾.但一些基本概念仍然应该清楚.在这里,我整理: HTTP--因特网的多媒体信使 HTTP 使用的是可靠的传输数据协议,因此即 ...

  10. IOT(Index Organized Table)

    我们知道一般的表都以堆(heap)的形式来组织的,这是无序的组织方式.Oracle还提供了一种有序的表,它就是索引组织表,简称IOT表.IOT表上必须要有主键,而IOT表本身不对应segment,表里 ...