一、从标题二开始看😁
这些天在使用rust写一个pc端应用程序,需要解析lnk文件获取lnk的图标以及原程序地址,之前并没有过pc端应用程序开发的经验, 所以在广大的互联网上游荡了两天。额🥺
今天找到了这个库 lnk_parse很好的解决标题的这个问题。
二、文档及github地址
您可以在以下链接找到他:
- lib.rs(推荐): https://lib.rs/crates/lnk_parser
- github(推荐):https://github.com/abdulrhmanalfaifi/lnk_parser
- docs.rs(没有示例代码): https://lib.rs/crates/lnk_parser
三、 使用
-
在
Cargo.toml
文件中[dependencies]
lnk_parser = "0.4.0" # 添加这行 -
使用示例
rust
use std::fs::File;
use std::io::Write;
use lnk_parser::LNKParser;
fn main() {
let lnk_path = "example.lnk";
let mut file = File::open(lnk_path).unwrap();
let lnk_file = LNKParser::from_reader(&mut file).unwrap();
// 将结果转化成json文件输到./lnk.json中
let json = serde_json::to_string(&lnk_file).unwrap();
let mut output_file = File::create("./lnk.json").unwrap();
output_file.write_all(json.as_bytes()).unwrap();
}
输出的json
内容如下(这里复制的lnk_parse
给出的示例)
json
{
"target_full_path": "C:\\Users\\u0041\\Desktop\\test\\test.txt",
"lnk_file_metadata": {
"full_path": "C:\\Users\\u0041\\Documents\\Projects\\LNKParser-rs\\samples\\WIN10\\1607_14393\\windows_generated.lnk",
"mtime": "2021-02-08T12:52:20Z",
"atime": "2021-02-13T19:14:07Z",
"ctime": "2021-02-08T12:52:13Z"
},
"shell_link_header": {
"file_attr": [
"ARCHIVE"
],
"mtime": "2021-02-08T12:41:58Z",
"atime": "2021-02-08T12:41:03Z",
"ctime": "2021-02-08T12:41:03Z",
"file_size": 4
},
"link_target_id_list": {
"id_list": [
{
"shell_item_data": {
"FileEntry": {
"is_file": false,
"file_size": 0,
"last_modified": "2021-02-08T12:46:24Z",
"file_attr_flags": [
"DIRECTORY"
],
"name": "test",
"extention_block": {
"ctime": "2021-02-08T12:46:24Z",
"atime": "2021-02-08T12:46:24Z",
"file_ref": {
"mft_entry": 91461,
"sequence_number": 3
},
"primary_name": "test"
}
}
}
},
{
"shell_item_data": {
"FileEntry": {
"is_file": true,
"file_size": 4,
"last_modified": "2021-02-08T12:42:00Z",
"file_attr_flags": [
"ARCHIVE"
],
"name": "test.txt",
"extention_block": {
"ctime": "2021-02-08T12:41:04Z",
"atime": "2021-02-08T12:41:04Z",
"file_ref": {
"mft_entry": 90070,
"sequence_number": 3
},
"primary_name": "test.txt"
}
}
}
}
]
},
"link_info": {
"volume_id": {
"drive_type": "DRIVE_FIXED",
"serial_number": "E02E-8A93"
},
"local_base_path": "C:\\Users\\u0041\\Desktop\\test\\test.txt"
},
"relative_path": "..\\..\\..\\..\\..\\Desktop\\test\\test.txt",
"working_dir": "C:\\Users\\u0041\\Desktop\\test",
"extra_data": {
"extra_data_blocks": [
{
"Tracker": {
"machine_id": "win10",
"file_droid": "BD4FAD74-6A0A-11EB-8ECF-5076AFA95947",
"file_droid_birth": "BD4FAD74-6A0A-11EB-8ECF-5076AFA95947",
"volume_droid": "00D2581C-4749-44BD-9381-9BDFADF8A9DE",
"volume_droid_birth": "00D2581C-4749-44BD-9381-9BDFADF8A9DE"
}
}
]
}
}
至于如何获取图标(看有注释那行):
rust
use std::fs::File;
use std::io::Write;
use lnk_parser::LNKParser;
fn main() {
let lnk_path = "example.lnk";
let mut file = File::open(lnk_path).unwrap();
let lnk_file = LNKParser::from_reader(&mut file).unwrap();
let icon = lnk_file.get_icon_location(); // 使用这个方法就可以获取lnk的图标
let mut icon_path:String;
if let Some(path) = icon {
icon_path = path.string.clone();
println!("path: {:?}", path.string);
}
}