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

 

时间: 2024-11-08 17:19:10

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

Java创建ZIP压缩文件的方法_java

本文实例讲述了Java创建ZIP压缩文件的方法.分享给大家供大家参考.具体如下: 这里注意:建议使用org.apache.tools.zip.*包下相关类,否则可能会出现中文乱码问题. /** * 压缩文件夹 * @param sourceDIR 文件夹名称(包含路径) * @param targetZipFile 生成zip文件名 * @author liuxiangwei */ public static void zipDIR(String sourceDIR, String target

Java解析xml的四种方法汇总_java

1. DOM(JAXP Crimson解析器) DOM是用与平台和语言无关的方式表示XML文档的官方W3C标准.DOM是以层次结构组织的节点或信息片断的集合.这个层次结构允许开发人员在树中寻找特定信息.分析该结构通常需要加载整个文档和构造层次结构,然后才能做任何工作.由于它是基于信息层次的,因而DOM被认为是基于树或基于对象的.DOM以及广义的基于树的处理具有几个优点.首先,由于树在内存中是持久的,因此可以修改它以便应用程序能对数据和结构作出更改.它还可以在任何时候在树中上下导航,而不是像SAX

详解Java解析XML的四种方法_java

XML现在已经成为一种通用的数据交换格式,它的平台无关性,语言无关性,系统无关性,给数据集成与交互带来了极大的方便.对于XML本身的语法知识与技术细节,需要阅读相关的技术文献,这里面包括的内容有DOM(Document Object Model),DTD(Document Type Definition),SAX(Simple API for XML),XSD(Xml Schema Definition),XSLT(Extensible Stylesheet Language Transform

Java解析XML的四种方法详解_java

XML现在已经成为一种通用的数据交换格式,它的平台无关性,语言无关性,系统无关性,给数据集成与交互带来了极大的方便.对于XML本身的语法知识与技术细节,需要阅读相关的技术文献,这里面包括的内容有DOM(Document Object Model),DTD(Document Type Definition),SAX(Simple API for XML),XSD(Xml Schema Definition),XSLT(Extensible Stylesheet Language Transform

Java解析XML格式数据的方法详解_java

最初,XML 语言仅仅是意图用来作为 HTML 语言的替代品而出现的,但是随着该语言的不断发展和完善,人们越来越发现它所具有的优点:例如标记语言可扩展,严格的语法规定,可使用有意义的标记,内容存储和表现分离等等优势注定了该语言从诞生之日起就会走向辉煌. XML 语言在成为 W3C 标准之后进入到了一个快速发展的时期,当然它本身所具有的一系列优点和优势也注定了各大技术厂商对它的偏爱,Java 作为软件行业的一种开发技术也迅速作出了反应,出现了多种对 XML 支持的工具,本文将会从这个角度对 Jav

java如何解析/读取xml文件_java

本文实例为大家分享了java解析/读取xml文件的方法,供大家参考,具体内容如下 XML文件 <?xml version="1.0"?> <students> <student> <name>John</name> <grade>B</grade> <age>12</age> </student> <student> <name>Mary<

.lnk文件 和一种较新的.lnk病毒及解决方法

前两天一个同学的电脑发生了此种情况,所有(包括开始菜单里的所有东西)快捷方式都变为了浏览器的.lnk(快捷方式)文件,而且一打开东西,浏览器(因为默认都变为了浏览器的快捷方式)就不停的闪动,之后其它操作都无效了,只能强制关机重启.         究其原因应该是恶意程序修改了计算机的注册表所致,但用各种杀毒软件都查不出有病毒威胁.至于网上大多的解决方法好像都没成效.      解决方法: 1.首先 win开始键+r 2.打开运行程序 3.输入: regedit 4.找到: 计算机\HKEY_CU

java解析xml的问题

问题描述 我的目的是吧<clothes>到</clothes>和<comfort>到</comfort>中的index.suggestion.icon的数值拿出来,我该怎么弄?例如:输出6.建议着寒冷服装.chuanyi_6.jpg<clothes><chuanyi-zhishuindex="6"/><chuanyi-jianyisuggestion="建议着寒冷服装"/><c

Java使用设计模式中的工厂方法模式实例解析_java

工厂方法模式的定义工厂方法(Factory Method)模式的意义是定义一个创建产品对象的工厂接口,将实际创建工作推迟到子类当中.核心工厂类不再负责产品的创建,这样核心类成为一个抽象工厂角色,仅负责具体工厂子类必须实现的接口,这样进一步抽象化的好处是使得工厂方法模式可以使系统在不修改具体工厂角色的情况下引进新的产品. 它包含了如下角色: 抽象产品(Product) 具体产品(ConcreteProduct) 抽象工厂(Factory) 具体工厂(ConcreteFactory) 模式的UML类