Java 解析 lnk 快捷方式文件的方法(转)-阿里云开发者社区

开发者社区> 开发与运维> 正文

Java 解析 lnk 快捷方式文件的方法(转)

简介:   package file.extendsion; import java.io.ByteArrayOutputStream; import java.io.File; import java.

 

 

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

 

版权声明:本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《阿里云开发者社区用户服务协议》和《阿里云开发者社区知识产权保护指引》。如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。

分享:
开发与运维
使用钉钉扫一扫加入圈子
+ 订阅

集结各类场景实战经验,助你开发运维畅行无忧

其他文章