如何在rust中解析 windows 的 lnk文件(快捷方式)
一、从标题二开始看😁
这些天在使用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" # 添加这行
- 使用示例
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
给出的示例)
{"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"}}]}
}
至于如何获取图标(看有注释那行):
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);}
}