zoukankan      html  css  js  c++  java
  • Java 解析 lnk 快捷方式文件的方法(转)

    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

  • 相关阅读:
    ZHI.ZSystem开发组件介绍之时间、IP及经纬帮助类
    ZHI.ZSystem开发组件介绍之发送HTTP请求
    ZHI.ZSystem开发组件介绍之随机字符串生成
    ZHI.ZSystem开发组件介绍之数据类型转换
    ZHI.ZSystem开发组件介绍之AES加密解密
    docker 环境mgr搭建
    ceph搭建配置-三节点
    查看当前库的总体运行情况(oracle)
    moodle笔记
    爬取豆瓣书籍信息
  • 原文地址:https://www.cnblogs.com/softidea/p/4583260.html
Copyright © 2011-2022 走看看