当前位置: 首页 > news >正文

如何在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

三、 使用

  1. Cargo.toml文件中
[dependencies]
lnk_parser = "0.4.0"   #  添加这行
  1. 使用示例
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);
    }
}

相关文章:

  • 23、什么是菱形继承【中高频】
  • el-tree(append与getNode与过滤)、深拷贝deepClone、监听addEventListener、
  • Aruco 库详解:计算机视觉中的高效标记检测工具
  • C++ 接口(抽象类)
  • 深入理解 CAS 与 ABA 问题
  • 基于Docker去创建MySQL的主从架构
  • Xss漏洞问题
  • 特定领域软件架构DSSA
  • 五、数组维度
  • 批量合并 Word 文档,支持合并成一个 Word,也支持按文件夹合并
  • 网络安全技术整体架构 一个中心三重防护
  • 进程间的通信1
  • Jetson Orin 安装 onnxruntime
  • Web3中的AI:一种去中心化智能的完整指南
  • 奥运会运动员年龄规定·棒球1号位
  • 【C++】5.6 try语句和异常处理
  • C# 命名空间(Namespace)详解
  • 稀疏注意力:打破Transformer计算瓶颈,实现高效长序列建模
  • ES02 - ES语句
  • TMS320F28P550SJ9学习笔记7:结构体寄存器方式配置SCI通信收发_SCI通信收发测试
  • 企信网企业信息查询平台官网/上海百度推广优化排名
  • 电子商务与网站建设/千锋教育学费多少
  • 网站做担保交易/站长之家工具查询
  • 好商网的网站可以做中英文切换吗/网络营销师有前途吗
  • 四川做网站设计哪家好/灰色关键词怎么做排名
  • wordpress手机移动版/关键词seo排名