如何在rust中解析 windows 的 lnk文件(快捷方式)

一、从标题二开始看😁

这些天在使用rust写一个pc端应用程序,需要解析lnk文件获取lnk的图标以及原程序地址,之前并没有过pc端应用程序开发的经验, 所以在广大的互联网上游荡了两天。额🥺

今天找到了这个库 lnk_parse很好的解决标题的这个问题。

二、文档及github地址

您可以在以下链接找到他:

三、 使用

  1. Cargo.toml文件中

    [dependencies]
    lnk_parser = "0.4.0" # 添加这行

  2. 使用示例

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);
    }
}
相关推荐
凢en3 分钟前
Perl——qw()函数
开发语言·perl
郝学胜-神的一滴10 分钟前
基于C++的词法分析器:使用正则表达式的实现
开发语言·c++·程序人生·正则表达式·stl
网硕互联的小客服35 分钟前
Apache 如何支持SHTML(SSI)的配置方法
运维·服务器·网络·windows·php
etcix1 小时前
implement copy file content to clipboard on Windows
windows·stm32·单片机
许泽宇的技术分享1 小时前
Windows MCP.Net:基于.NET的Windows桌面自动化MCP服务器深度解析
windows·自动化·.net
林开落L2 小时前
库的制作与原理
linux·开发语言·动静态库·库的制作
m0_480502642 小时前
Rust 入门 泛型和特征-特征对象 (十四)
开发语言·后端·rust
非凡ghost2 小时前
AMS PhotoMaster:全方位提升你的照片编辑体验
windows·学习·信息可视化·软件需求
瓦特what?3 小时前
关于C++的#include的超超超详细讲解
java·开发语言·数据结构·c++·算法·信息可视化·数据挖掘
RustFS3 小时前
如何用 Rust 对 RustFS MCP Server 进行扩展?
rust