博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Java 解析 lnk 快捷方式文件的方法(转)
阅读量:6755 次
发布时间:2019-06-26

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

 

 

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://mggho.baihongyu.com/

你可能感兴趣的文章
Linux篇---Vi的使用
查看>>
【Python】列表、字典和元组的排序
查看>>
关于c语言的输入输出
查看>>
(三)springmvc+mybatis+dubbo+zookeeper分布式架构 整合 - maven模块规划
查看>>
OC语言 关于description的探讨
查看>>
windows串口通信的一个活动图
查看>>
递归算法题
查看>>
【Algorithm】转一个ACM训练计划
查看>>
HashSet其实就那么一回事儿之源码浅析
查看>>
浏览器的标准模式和怪异模式
查看>>
[C#]分享一个以前的项目使用的DataBaseAccess类
查看>>
POJ-2236-Wireless Network
查看>>
ASP.NET引用母版页属性的问题
查看>>
JavaScript 模块模式
查看>>
链接返回上级或事件返回上级
查看>>
ROS学习之catkin_make
查看>>
Android中的颜色值RGB对照表表
查看>>
css单位
查看>>
jquery.validate remote BUG
查看>>
一百元的智能家居——Asp.Net Mvc Api+讯飞语音+Android+Arduino
查看>>