一、從標題二開始看😁
這些天在使用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);}
}