通过快捷方式lnk获得文件真实路径
通过快捷方式.lnk获得文件真实路径
前提
最近开发资源管理,需要预先上传大量资源,负责整理资源的同学因为空间不足,直接用快捷键方式整理视频资源OTZ,所以只能想办法通过.lnk文件获得文件的真实地址。
以下所有内容都来自网络,博主仅做了参考与总结。
.lnk文件格式解析
此处对lnk文件组成做一个大概介绍主旨是帮助了解如何从link文件中提取需要的信息
一个lnk文件包括一下几个模块:
模块 备注
注意:
不是所有的模块都必须包含在内,但如果存在就要按上述的顺序排列。
以下我们详细了解需要用到的两个模块:
1. 文件头(lnk file header)
偏移 长度 类型 备注
0x14处16进制数的含义:

0x18处16进制数的含义:

2. 文件位置信息段(File location info)

0x08偏移flags 具体含义:
如果目标文件是本地文件,那么文件名称 = 本地路径信息+剩余偏移路径
如果目标文件是网络文件,那么文件名称 = 网络卷中共享名称+剩余偏移路径
所以,File location info节之后的数据是,本地卷信息表,及网络卷信息表。
1. 本地卷信息表结构

2. 网络卷信息表结构

注意:
八个比特(Bit)称为一个字节(Byte),两个字节称为一个字(Word),两个字称为一个双字(Dword),两个双字称为一个四字(Qword)。
代码
private void parseLink(File f) throws FileNotFoundException, IOException {
FileInputStream fin = new FileInputStream(f);
byte[] link = new byte[(int)f.length()];
//读取文件中的内容到link[]数组
fin.read(link);
fin.close();
// 判断当前文件是否为快捷方式
if(!isLnkFile(link)){
return;
}
// 获得flags信息
byte flags = link[0x14];
int shell_len = 0;
// 0000 0000 xxxx xxxx & 0000 0000 0000 0001(判断是否包含shell item id list段)
if((flags & 0x1) > 0) {
// 如果存在,则获取shell item id list段的总长度,加2是为了将link[0x4c]本身的长度计算在内
shell_len = bytes2short(link,0x4c) + 2;
}
// 获得文件位置信息段的开始位置=shell item id list段的开始位置+shell item id list段的总长度
int file_start = 0x4c + shell_len;
// 获取本地路径信息的偏移
int local_sys_off = link[file_start + 0x10] + file_start;
String real_file = getNullDelimitedString(link, local_sys_off);
System.out.println(real_file);
}
private boolean isLnkFile(byte[] link) {
if (link[0x00]== 0x4c) {// 76,L,0x4c代表lnk文件格式
return true;
}
return false;
}
/**
* 将两个字节转换为short<br>
* 注意,因为仅限英特尔操作系统,所以这是小端字节<br>
*/
private int bytes2short(byte[] bytes, int off) {
return bytes[off] | (bytes[off + 1] << 8);
}
/**
* 获得从偏移位置off到以‘0’为结尾分割字符串
* @param bytes 源数组
* @param off 偏移位置
* @return 字符串
*/
private String getNullDelimitedString(byte[] bytes, int off) {
int len = 0;
// 计算字符串占用数组的真实长度
while (true) {
if (bytes[off + len] == 0) {
break;
}
len++;
}
byte[] results = new byte[len];
for (int i = off, j = 0; i < off + len; i++, j++) {
results[j] = bytes[i];
}
try {
// 因为我是中文系统,所以设置了字符集GBK,否则中文路径会出现乱码
return new String(bytes, off, len, "GBK");
} catch (UnsupportedEncodingException e) {
e.printStackTrace();
}
return null;
}
import sys
import win32com.client shell = win32com.client.Dispatch("WScript.Shell")
shortcut = shell.CreateShortCut("t:\\test.lnk")
print(shortcut.Targetpath)
通过快捷方式lnk获得文件真实路径的更多相关文章
- struts2获取文件真实路径
CreateTime--2017年8月25日15:59:33 Author:Marydon struts2获取文件真实路径 需要导入: import java.io.FileNotFoundExc ...
- windows下,读取快捷方式lnk所指向的路径
BOOL GetLnkFileName( OUT PWSTR pLnkName, OUT PWSTR OepnFileNameBuufer, IN DWORD OpenFileNameBufferSi ...
- jsp和java获取文件或路径
1.如何获得当前文件路径常用:(1).Test.class.getResource("")得到的是当前类FileTest.class文件的URI目录.不包括自己!(2).Test. ...
- OpenFileDialog 打开快捷方式时,返回的是快捷方式引用的路径,而不是快捷方式(.lnk)自身的路径
OpenFileDialog 打开 .lnk 文件. OpenFileDialog 有个DereferenceLinks 属性:获取或设置一个值,该值指示文件对话框是返回快捷方式引用的文件的位置,还是 ...
- JSTL获取Session的ID与获取文件的真实路径与项目名称
今天在测试集群配置的时候想到session共享,因此想要获取sessionID,可以通过下面方法: ${pageContext.session.id} 获取文件的真实路径: <%=request ...
- IE8下服务端获取客户端文件的路径为C:/fakePath问题的解决方案
上一篇文章上提到,IE8下服务端获取客户端文件的路径时,会变成C:/fakePath问题,于是乎通过文件路径去获得文件大小就失败了. 上网搜了一下,主要原因是IE8因为安全考虑,在上传文件时屏蔽了真实 ...
- IE8上传文件时文件本地路径变成"C:\fakepath\"的问题
转自:http://yunzhu.iteye.com/blog/1116893 在使用<input id="file_upl" type="file" / ...
- C# 读取快捷方式指向的文件
C# 读取快捷方式指向的文件 [Flags()] public enum SLR_FLAGS { SLR_NO_UI = 0x1, SLR_ANY_MATCH = 0x2, SLR_UPDATE = ...
- PHP获取当期前运行文件的路径,名字,服务器路径
<?phpecho "显示脚本文件的相对路径和文件名:\"".$_SERVER["PHP_SELF"]."\"<br& ...
随机推荐
- socket编程之黏包
原理概述 上图是我在学习python的socket编程中遇到的黏包问题所画,以实例来说明这个高大上的黏包问题. 我们知道socket()实例中sendall()方法是无论数据有多大,一次性提交写入缓冲 ...
- 上传文件到CDN,上传后文件错误。
开始用xfp上传,发现文件错误.后来改用filezilla,上传后文件正确.害苦了我啊
- shell脚本执行出现“期待整数表达式”
在执行shell时一直出现“integer expression expected”,找了很久也没发现那个地方出错.翻了笔记发现-le并不错啊,甚至还怀疑零是不是整数还特意上网搜了下 -_- . 最后 ...
- innodb事务锁的一些常见数据结构
lock_sys_t 整个innodb的锁系统管理结构体,定义在lock0lock.h中.在lock0lock.cc中有一个lock_sys_t的全局指针lock_sys, 由lock_sys_cre ...
- 最新 斗鱼java校招面经 (含整理过的面试题大全)
从6月到10月,经过4个月努力和坚持,自己有幸拿到了网易雷火.京东.去哪儿.斗鱼等10家互联网公司的校招Offer,因为某些自身原因最终选择了斗鱼.6.7月主要是做系统复习.项目复盘.LeetCode ...
- DataNode 详解及HDFS 2.X新特性
1. 工作机制 一个数据块在 DataNode 上以文件形式存储在磁盘上,包括两个文件,一个是数据本身,一个是元数据包括数据块的长度,块数据的校验和,以及时间戳. DataNode 启动后向 Name ...
- axios 使用post方式传递参数,后端接收不到
最近做vue项目,做图片上传的功能,使用get给后台发送数据,后台能收到,使用post给后台发送图片信息的时候,vue axios post请求发送图片base64编码给后台报错HTTP 错误 414 ...
- kafka server.properties 配置文件详解(二)
虽然在前面一部分我们启动了kafka集群,并通过控制台的方式实现了producer和consumer,但是我们还是了解一下kafka单个节点是的配置参数属性, 也只有了解了这些参数的配置,才能将kaf ...
- [转帖]订购微软Windows 7延长支持服务的报价曝光 第三年要价两百美金
订购微软Windows 7延长支持服务的报价曝光 第三年要价两百美金 cnbeta 年2月份的新闻 https://www.cnbeta.com/articles/tech/815885.htm 微软 ...
- HTTP报文学习
HTTP报文用于HTTP协议的信息交互,分为请求报文和响应报文.报文由首部和主体两部分组成,中间使用空行(CR+LF)分隔 1. 报文结构 报文由首部.空行和实体组成: 报文中首先是请求行或者状态行, ...