nodejs 读写 ini

依赖项

需要提前安装 node-gyp ,
node-gyp 只要有对应版本的 python 与 c++ 环境, 应该就没啥问题了.

"devDependencies": {"@types/node": "^20.4.8","@types/ffi-napi": "^4.0.7",  "ffi-napi": "^4.0.3","tsx": "^3.12.7","typescript": "^5.0.2",
}

TypeScript

import * as ffi from 'ffi-napi';// 读写 string , 好像可以替代 读写 int
let kernel32 = new ffi.Library('kernel32.dll', {GetPrivateProfileStringA: ["int", ['string', 'string', 'string', "pointer", 'int', 'string']],WritePrivateProfileStringA: ["int", ["string", "string", "string", "string"]],GetPrivateProfileSectionNamesA: ['int', ['pointer', 'int', 'string']],GetPrivateProfileSectionA: ['int', ['string', 'pointer', 'int', 'string']]
});export function readString(filePath: string, sectionName: string, keyName: string, defaultValue: string = "") {const MAX_BUFFER_SIZE = 1024;const lpReturnedString = Buffer.alloc(MAX_BUFFER_SIZE);const result = kernel32.GetPrivateProfileStringA(sectionName,         // 节名称keyName,             // 键名称defaultValue,                    // 默认值(如果键不存在时返回的值)lpReturnedString as any,      // 接收字符串值的缓冲区MAX_BUFFER_SIZE,       // 缓冲区大小filePath           // INI 文件的路径);const returnedString = lpReturnedString.toString('utf8', 0, result);return returnedString;
}export function writeString(filePath: string, sectionName: string, keyName: string, value: string) {let res = kernel32.WritePrivateProfileStringA(sectionName, keyName, value, filePath)return res != 0;
}export function removeKey(filePath: string, sectionName: string, keyName: string) {let res = kernel32.WritePrivateProfileStringA(sectionName, keyName, null, filePath)return res != 0;
}
export function removeSection(filePath: string, sectionName: string) {let res = kernel32.WritePrivateProfileStringA(sectionName, null, null, filePath)return res != 0;
}export function readAllSectionNames(filePath: string) {const MAX_BUFFER_SIZE = 32767;const lpReturnedString = Buffer.alloc(MAX_BUFFER_SIZE);const result = kernel32.GetPrivateProfileSectionNamesA(lpReturnedString as any, // 接收节名称列表的缓冲区指针MAX_BUFFER_SIZE,  // 缓冲区大小filePath      // INI 文件的路径);const sectionNames = lpReturnedString.toString('utf8', 0, result).split('\0').filter(Boolean);return sectionNames;
}export function readKeyAndValue(filePath: string, sectionName: string) {const MAX_BUFFER_SIZE = 32767;const lpReturnedString = Buffer.alloc(MAX_BUFFER_SIZE);const result = kernel32.GetPrivateProfileSectionA(sectionName,    // 节名称lpReturnedString as any, // 接收键值对列表的缓冲区指针MAX_BUFFER_SIZE,  // 缓冲区大小filePath      // INI 文件的路径);// 从缓冲区读取键值对列表并进行解析const keyValuePairs = lpReturnedString.toString('utf8', 0, result).split('\0').filter(Boolean);let retMap = new Map<string, string>();for (const item of keyValuePairs) {let a = item.split('=');retMap.set(a[0], a[1])}return retMap;
}// 读取所有内容
export function readAllData(filePath: string) {let ret = new Map<string, Map<string, string>>();let sectionList = readAllSectionNames(filePath);for (const sectionName of sectionList) {let keyList = readKeyAndValue(filePath, sectionName)let obj = new Map<string, string>();for (const item of keyList) {obj.set(item[0], item[1])}ret.set(sectionName, obj)}return ret;
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/25458.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

分布式 - 服务器Nginx:常见问题总结(二)

文章目录 01. Nginx 虚拟主机怎么配置?02. Nginx location 指令的作用&#xff1f;03. Nginx location 指令如何与其他指令一起使用&#xff1f;04. Nginx root 命令的作用&#xff1f;05. Nginx if 模块的作用&#xff1f;06. Nginx include 指令的作用&#xff1f;07. Nginx…

ThinkPHP函数深度解析

ThinkPHP是一个具有丰富功能和强大灵活性的PHP开发框架。在这篇文章中&#xff0c;我们将详细介绍ThinkPHP的一些关键函数&#xff0c;以帮助开发人员更好地理解和使用这个框架。 1. 入门&#xff1a;ThinkPHP的核心函数 1.1 C()函数 C()函数用于读取和设置配置参数。它是Thin…

【Spring】使用注解的方式获取Bean对象(对象装配)

目录 一、了解对象装配 1、属性注入 1.1、属性注入的优缺点分析 2、setter注入 2.1、setter注入的优缺点分析 3、构造方法注入 3.1、构造方法注入的优缺点 二、Resource注解 三、综合练习 上一个博客中&#xff0c;我们了解了使用注解快速的将对象存储到Spring中&#x…

Android:自己写一个简单记事本

一、前言&#xff1a;我的app是点击加号跳转到另一个界面 那么我遇到的问题的是点击加号是一个从一个Fragment跳转到另一个Fragment跳转失败。 二、解决方案&#xff1a; //相应控件的监听里面实现跳转FragmentManager fragmentManagergetFragmentManager();fragmentManager.b…

网络可靠性之链路聚合

网络的可靠性 网络的可靠性指当设备或者链路出现单点或者多点故障时保证网络服务不间断的能力网络的可靠性是可以从单板、设备、链路多个层面实现。 链路聚合 以太网链路聚合&#xff1a; 通过将多个物理接口捆绑成为一个逻辑接口&#xff0c;可以再不进行硬件升级的条件下&a…

css滚动条样式指南

css滚动条样式指南 滚动条是网页设计中经常被忽视的元素。虽然它看起来像是一个小细节&#xff0c;但它在网站导航中起着至关重要的作用。默认的滚动条可能看起来不合适&#xff0c;有损整体美观。本文将介绍如何使用 CSS 自定义滚动条。 在 Chrome、Edge 和 Safari 中设置滚…

【Rust 基础篇】Rust类函数宏:代码生成的魔法

导言 Rust是一门现代的、安全的系统级编程语言&#xff0c;它提供了丰富的元编程特性&#xff0c;其中类函数宏&#xff08;Function-Like Macros&#xff09;是其中之一。类函数宏允许开发者创建类似函数调用的宏&#xff0c;并在编译期间对代码进行生成和转换。在本篇博客中…

基于Azure OpenAI Service 的知识库搭建实验⼿册

1.概要 介绍如何使⽤Azure OpenAI Service 的嵌⼊技术&#xff0c;创建知识库&#xff1b;以及创建必要的资源组和资源&#xff0c;包括 Form Recognizer 资源和 Azure 翻译器资源。在创建问答机器⼈服务时&#xff0c;需要使⽤已部署模型的 Azure OpenAI 资源、已存在的…

SAP-MM-发票校验的重复校验功能

路径&#xff1a;SPRO-物料管理-后勤发票校验-收入发票-设置重复发票检查 按公司代码设置重复检查&#xff0c;可以按三个方式进行检查&#xff0c;公司代码、参照、发票日期&#xff0c;如果此处未维护就是按供应商&#xff08;XK02&#xff09;的六项进行检查 但是如果两处都…

MySQL 中的 distinct 和 group by 哪个效率更高?

在 MySQL 中&#xff0c;DISTINCT 和 GROUP BY 都是用来去除重复的数据&#xff0c;但它们的使用场景和性能影响是不同的。 有索引的情况下 group by 和 distinct 都能使用索引&#xff0c;效率相同。 无索引的情况下 distinct 效率高于 group by。原因是 distinct 和 group …

深入学习 Redis - 事务、实现原理、指令使用及场景

目录 一、Redis 事务 vs MySQL事务 二、Redis 事务的执行原理 2.1、执行原理 2.2、Redis 事务设计这么简单&#xff0c;为什么不涉及成 MySQL 那样强大呢&#xff1f; 三、Redis 事务的使用 3.1、使用场景 3.2、具体演示 开启/执行/放弃事务 watch 监控 watch 实现原理…

chapter14:springboot与安全

Spring Boot与安全视频 Spring Security, shiro等安全框架。主要功能是”认证“和”授权“&#xff0c;或者说是访问控制。 认证&#xff08;Authentication&#xff09;是建立在一个声明主体的过程&#xff08;一个主体一般指用户&#xff0c;设备或一些可以在你的应用程序中…

nginx配置访问springboot服务

一、idea中可通过 clean package打包命令&#xff0c;打好包 ,比如&#xff1a;端口为8080&#xff0c;服务访问地址为/&#xff0c; 前端打包文件为dist&#xff0c;访端口为8000&#xff0c; 则可以这样配置nginx server {listen 8000;location / {root html/dist;…

ASP.NET Core SignalR

ASP.NET Core SignalR是一个开发实时网络应用程序的框架&#xff0c;它使用WebSocket作为传输协议&#xff0c;并提供了一种简单和高效的方式来实现实时双向通信。 SignalR使用了一种称为"Hub"的概念来管理连接和消息的传递。开发者可以编写自己的Hub类&#xff0c;…

Django之JWT库与SimpleJWT库的使用

Django之JWT库与SimpleJWT库的使用 JWTJWT概述头部(header)载荷(payload)签名(signature) Django使用JWT说明jwt库的使用安装依赖库配置settings.py文件配置urls.py文件创建视图配置权限 SimpleJWT库的使用安装SimpleJWT库配置Django项目配置路由创建用户接口测试身份认证自定义…

【雕爷学编程】Arduino动手做(190)---MAX4466声音模块

37款传感器与模块的提法&#xff0c;在网络上广泛流传&#xff0c;其实Arduino能够兼容的传感器模块肯定是不止37种的。鉴于本人手头积累了一些传感器和执行器模块&#xff0c;依照实践出真知&#xff08;一定要动手做&#xff09;的理念&#xff0c;以学习和交流为目的&#x…

(五)Node.js -模块的加载机制

1. 优先从缓存中加载 模块在第一次加载后会被缓存。这意味着多次调用require()不会导致模块的代码被执行多次。 注意&#xff1a;不论是内置模块、用户自定义模块、还是第三方模块&#xff0c;它们都会优先从缓存中加载&#xff0c;从而提高模块的加载效率。 2. 内置模块的加载…

Jenkins Gerrit Trigger实践

1.创建Gerrit Trigger 2.jenkins master节点生成gerrit用户的密钥 这里的用户名得写登录gerrit后个人信息中的 Username 3.gerrit 配置刚刚jenkins生成密钥的公钥 4.gerrit 用户加入群组 不加这个群组&#xff0c;下一步测试就会报错“User aeshare has no capability conn…

通过VBA宏合并Excel工作表

工作中经常会用到的把几个Excel文件合并到一个&#xff0c;或者是把一个Excel文件里的所有Sheet合并到一个Sheet来进行统计。下面分别提供用vba宏来解决这两个问题的方法。 1、合并Excel文件 打开一个空Excel文件&#xff0c;AltF11&#xff0c;插入一个模块&#xff0c;开始…

Dueling Network

Dueling Network —— Dueling Network Architectures for Deep Reinforcement Learning 论文下载地址 论文介绍 图9. Dueling Network 模型结果示意图 Dueling Network与传统DQN的区别在于神经网络结构的不同&#xff0c;Dueling Netowrk在传统DQN的基础上只进行了微小的改动…