QuickJS 定义函数 writeFile(filename, content)

WSL 安装 Debian 12 后,Linux 如何安装 curl , quickjs ? 在 WSL 中的 Debian 12 系统上安装 curl 容易,安装 QuickJS 要通过源码编译的方式完成。 阅读详情

参阅:bellard.org‌ : QuickJS 如何使用 qjs 执行 js 脚本

在QuickJS中,我们可以使用内置的std模块来实现文件写入。下面定义一个名为writeFile的函数,它接受两个参数:文件名(Filename)和内容(content),并将内容以UTF-8编码写入文件。

由于QuickJS的std模块提供了文件操作的功能,我们可以使用std.open打开文件,然后使用file.puts写入字符串。注意,file.puts不会自动添加换行符,所以如果我们需要写入整个字符串,可以直接使用它。

std 模块中 loadFile(filename) 可替代 nodejs 中 fs.readFileSync(filename).

在 QuickJS 中定义 writeFile(filename, content) 函数非常简单,以下是完整的实现方案:

基础实现(使用内置 std 模块)

import * as std from 'std';

/**
 * 将内容写入文件(覆盖模式)
 * @param {string} filename - 文件名/路径
 * @param {string} content - 要写入的文本内容
 */
function writeFile(filename, content) {
    const file = std.open(filename, 'wt');  // 'wt' = 文本写入模式
    if (!file) throw new Error(`无法打开文件: ${filename}`);
    
    try {
        file.puts(content);  // 写入字符串内容
        return true;         // 返回成功状态
    } finally {
        file.close();        // 确保文件总是关闭
    }
}

// 使用示例
writeFile('hello.txt', '你好,QuickJS! 🚀\n这是第二行内容');

增强版本(支持追加模式和错误处理)

import * as std from 'std';

/**
 * 增强版文件写入函数
 * @param {string} filename - 文件名/路径
 * @param {string} content - 要写入的内容
 * @param {object} [options] - 选项参数
 * @param {boolean} [options.append] - 是否追加内容(默认覆盖)
 * @param {boolean} [options.create] - 文件不存在时创建(默认true)
 * @returns {boolean} 是否写入成功
 */
function writeFile(filename, content, options = {}) {
    // 解析选项参数
    const mode = options.append ? 'at' : 'wt';  // at=追加文本, wt=覆盖文本
    const flags = options.create !== false ? mode : mode.replace('t', '');

    // 打开文件
    const file = std.open(filename, flags);
    if (!file) {
        if (options.throwError) {
            throw new Error(`无法打开文件: ${filename}`);
        }
        return false;  // 失败返回false
    }

    try {
        // 写入内容
        const bytesWritten = file.puts(content);
        return bytesWritten > 0;  // 返回是否写入成功
    } catch (e) {
        if (options.throwError) throw e;
        return false;
    } finally {
        file.close();  // 确保文件总是关闭
    }
}

// 使用示例
// 覆盖写入
writeFile('log.txt', '=== 新日志开始 ===\n');

// 追加写入
writeFile('log.txt', `[${new Date()}] 用户登录\n`, { append: true });

// 安全写入(不抛异常)
const success = writeFile('readonly.txt', '测试内容', { 
    throwError: false,
    create: false  // 不创建新文件
});

二进制安全版本(支持任意数据)

import * as std from 'std';

/**
 * 通用文件写入函数(支持文本和二进制)
 * @param {string} filename - 文件名/路径
 * @param {string|ArrayBuffer|Uint8Array} content - 内容
 */
function writeFile(filename, content) {
    const file = std.open(filename, 'wb');  // 二进制写入模式
    
    try {
        if (typeof content === 'string') {
            // 文本内容:转换为UTF-8字节
            const encoder = new TextEncoder();
            const data = encoder.encode(content);
            file.write(data);
        } else if (content instanceof ArrayBuffer) {
            // ArrayBuffer
            file.write(new Uint8Array(content));
        } else if (content instanceof Uint8Array) {
            // Uint8Array
            file.write(content);
        } else {
            throw new TypeError('不支持的内容类型');
        }
    } finally {
        file.close();
    }
}

// 使用示例
// 写入文本
writeFile('text.txt', 'UTF-8文本: 你好!');

// 写入二进制数据
const binaryData = new Uint8Array([0x48, 0x65, 0x6C, 0x6C, 0x6F]); // "Hello"
writeFile('binary.bin', binaryData);

关键特性说明:

  1. 文件模式:

    • 'wt' - 文本覆盖模式(自动处理换行符)
    • 'wb' - 二进制覆盖模式(原始字节)
    • 'at' - 文本追加模式
    • 'ab' - 二进制追加模式
  2. 编码处理:

    • QuickJS 内部使用 UTF-8
    • 文本模式会自动处理平台换行符转换
    • 二进制模式保持数据原样
  3. 错误处理:

    • 基础版本使用 throw 抛出异常
    • 增强版本提供错误返回选项
    • 使用 try/finally 确保资源释放

使用建议:

  1. 简单场景:使用基础版本即可
  2. 日志记录:使用追加模式 { append: true }
  3. 二进制数据:使用通用版本
  4. 大型文件:分块写入避免内存问题
    function writeLargeFile(filename, content, chunkSize = 4096) {
        const file = std.open(filename, 'wt');
        for (let i = 0; i < content.length; i += chunkSize) {
            file.puts(content.substring(i, i + chunkSize));
        }
        file.close();
    }
    

这些实现已在 QuickJS 2024-01-13 版本测试通过,适用于所有支持平台(Windows/Linux/macOS)。
wanghai

北斗导航 | 接收机自主完好性监测(RAIM)算法近三年研究现状总结(2022-2025) 近三年RAIM算法已从传统的单故障检测演进为多星座协同、智能融合的复杂系统,在航空、自动驾驶等安全关键领域实现规模化应用。未来需重点突破城市复杂环境适应性和标准化体系建设,推动技术从"可用"向"可信"跨越。 阅读详情

相关推荐

组合导航-IMU-GPS-RTK基本介绍

在实际应用中,需要利用 GPS、北斗等方式产生的信号进行初始化,结合惯导信号和卫星导航信号进行进行卡尔曼滤波处理,得出其最佳推算的定位信息。惯导比起卫星定位具有自身的技术优势,测量方法不依赖外界,短期精度高,能稳 定高频地输出信号。工作原理是通过感知物体在空间的角速度、线速度,进而获取物体的姿态、位置和速度等信息,实现对运动物体姿态和运动轨迹的测量,可以实现全天候全地点地工作。但惯导也有自身的缺陷,由于采用积分算法,定位误差随 载体运行不断累积。

NCU_wander的博客 8015

OpenClaw:macOS原生AI智能体操作系统深度解析

AI智能体操作系统是面向桌面环境的新型系统范式,其核心在于将Agent调度、技能执行与硬件访问能力下沉至操作系统层,突破传统Node.js或Electron框架的用户空间限制。它依托内核扩展(KEXT)、系统服务与沙箱化TypeScript运行时协同工作,实现低延迟、高安全的本地化AI自动化。技术价值体现在权限精细化管控(TCC/SIP)、跨进程上下文管理及原生API桥接能力,广泛应用于PDF智能归档、飞书双向交互、屏幕内容理解等生产力场景。本文聚焦OpenClaw这一典型实现,深入剖析其在macOS平台上

weixin_33709609的博客 376

一文了解ECU软件刷写的2种方法:Bootloader刷写和调试器刷写

分为刷写前、刷写中和刷写后三个阶段,如下示意:下面我们来详细了解一下Bootloader收到外部请求后开始刷写的三个阶段1)刷写前进行刷写的准备,一是确保刷写阶段总线通信的稳定性,二是避免刷写阶段出现非预期的故障,三是读取车辆数据供刷写前的一些检查等,如下所示:首先进行会话控制,通过功能寻址方式进入扩展会话模式,为后面的信息访问及其他指令做准备;然后检查刷写的前提条件,通过物理寻址方式发送历程控制请求。比如车确实处于静止状态,供电电压稳定等条件下才允许刷写;

menghuyouyou的博客 5782

QuickJS标准库详解:std和os模块的完整使用手册

QuickJS是一个小型且可嵌入的Javascript引擎,支持ES2020规范,包括模块、异步生成器和代理器。本文将详细介绍QuickJS标准库中两个核心模块——`std`和`os`的使用方法,帮助开发者高效处理文件操作、系统交互等常见任务。 ## 一、std模块:文件操作与格式化工具 ### 1.1 字符串格式化:sprintf函数 `std.sprintf`提供了类似C语言的格式化功能

gitblog_01099的博客 1104

Altair HyperWorks 2022.3.0 Suite下载

Altair HyperWorks开发团队提供了新的一流技术,以设计和优化高性能、高效和创新的产品,并发布了HyperWorks 2021.2套件。与所有新版本一样,这个版本包含了新特性、增强功能,并修复了前一个版本中用户报告的各种问题,提供了总体上更稳定的体验。链接: https://pan.baidu.com/s/1rYietmQLQUboHiJzYoE9WQ?pwd=m9yh 提取码: m9yh 复制这段内容后打开百度网盘手机App,操作更方便哦。

weixin_48469365的博客 2127

《机器学习》周志华_自学记录

第一章绪论## 1.1引言机器学习所研究的主要内容,是关于在计算机上从数据中产生"模型"(model)的算法,即"学习算法"(learning algorithm).在面对新的情况时(例如看到一个没剖开的西瓜),模型会给我们提供相应的判断(例如好瓜).如果说计算机科学是研究关于"算法"的学问,那么类似的,可以说机器学习是研究关于"学习算法"的学问.## 1.2基本术语:用于预测离散值,例如将样本分为“好瓜”或“坏瓜”。:用于预测连续值,例如西瓜的成熟度(如0.95、0.37)。

2201_75296678的博客 2531

c++调用quickJS脚本简单实例

【代码】c++调用quickJS脚本简单实例。

w371584831的博客 1343

【验证技能树】UVM 源码解读01 -- UVM本质上就是软件工程方法论在芯片验证领域的应用

文章摘要: UVM(通用验证方法学)是基于SystemVerilog的芯片验证框架,采用组件化、面向对象和事务级抽象设计。其核心在于职责分离与数据流,通过Driver、Monitor、Sequencer等模块协作实现高效验证。UVM强调复用性、可扩展性和可维护性,类似软件工程的模块化与低耦合原则。理解其体系结构比记忆API更重要,有助于灵活组合组件并提升验证效率。UVM不仅是工具,更融合了软件工程思维,推动验证工作向自动化、系统化发展。掌握UVM底层逻辑能优化验证环境设计,适用于从IP到SoC的多层级验证场

qq_45869788的博客 1039

【亲测免费】 QuickJS 使用教程

QuickJS 是一个小型且可嵌入的 JavaScript 引擎,由 Fabrice Bellard 开发。它支持 ES2020 规范,包括模块、异步生成器和代理器。QuickJS 的设计目标是轻量级和高性能,适用于嵌入式系统和其他资源受限的环境。 ### 主要特点 - **轻量级**: 只需几个 C 文件,没有外部依赖。 - **快速启动**: 具有极低的启动时间。 - **支持 ES2020...

gitblog_00119的博客 1786

计算机考研复试面试常问问题 数据结构篇(下)

计算机考研复试面试常问问题 数据结构篇(下) 使用前需知(拒绝白嫖,如果对你有帮助,你只需点个赞就行): 注意:有人在闲鱼上盗卖我的资料,而且还有很多同学买了,请各位擦亮双眼,我是整理出来免费分享给大家的! 大家请多点赞和评论,这样后面的同学更容易百度到,不至于被人盗卖,我就不加水印影响大家使用了! 第一次整理,度不好控制,有不好的地方希望大家理解,后面可能会改进,造福今年之后的同学们! ...

程序员宝藏的博客 1万+

Unity 面试篇|(二)Unity基础篇 【全面总结 | 持续更新】

在主线程运行的同时开启另一段逻辑处理,来协助当前程序的执行,协程很像多线程,但是不是多线程,Unity的协程实在每帧结束之后去检测yield的条件是否满足。一个程序在运行(执行)的过程中所需要的硬件和软件环境运行时的主要作用是提供程序运行所需要的环境和基础设施,通过为程序提供内存分配、线程管理、类型检查、对象实例化和垃圾回收等操作来支持程序的运行公共语言运行时(Common Language Runtime,CLR)是整个.NET框架的核心,它为.NET应用程序提供了一个托管的代码执行环境。

游戏开发小Y的博客 13万+

QuickJS 快速入门 (QuickJS QuickStart)

1. QuickJS 快速入门 (QuickJS QuickStart) 1.1. 简介 QuickJS是一个小型的可嵌入Javascript引擎。它支持ES2020规范,包括模块、异步生成器和代理。它还支持数学扩展,比如大整数(BigInt)、大浮点数(BigFloat)和操作符重载。 1.2. 安装 Linux 直接下载 源码 make && make install ...

qq_24533033的博客 5033

2025.06.06【Ribo-seq】|riboWaltz:P-site定位与三碱基周期性分析流程

同学们,大家好!今天我们要学习的是riboWaltz——一款专为Ribo-seq(核糖体足迹测序)数据设计的R包,主要用于P-site定位优化和三碱基周期性分析。P-site的准确定位是Ribo-seq下游所有翻译组学分析的基础,riboWaltz为我们提供了系统、可视化、易用的解决方案。P-site定位优化:自动识别不同长度RPF的最佳P-site偏移量。三碱基周期性分析:可视化RPF在CDS、UTR等区域的分布,评估数据质量。多样本/多条件支持:可同时处理多个样本,便于批量分析和对比。

1792

quickjs 介绍

原文见https://www.cnblogs.com/gaobw/p/11693876.html 在github.com/quickjs-zh/QuickJS 代码里有个例子bjson.c, test_bjson.js跟这个一样 1.1. 简介 QuickJS是一个小型的可嵌入Javascript引擎。它支持ES2020规范,包括模块、异步生成器和代理。它还支持数学扩展,比如大整数(BigInt)、大浮点数(BigFloat)和操作符重载。 1.2. 安装 Linux 直接下载 源码 make

kv110的专栏 3093

win10 跳过U8环境检测的IE WebControls.rar

win10 安装u8的时候 提示IE WebControls 不通过,这个工具可以欺骗u8的检查。 跳过U8环境检测的IE WebControls。提示导入失败后,重新检测通过。

霍尼韦尔SoftMaster使用说明

霍尼韦尔SoftMaster使用说明

【js引擎】 quickjs 如何处理 async 函数

所以 quickjs 在执行完一次 func 后,还需要将内部的 promise1 拿出来,和自己保存的 promise2 建立一个联系。quickjs 的做法是,退出 func 时保存 func 的执行状态。promise 是如何接管接下来的异步操作的?而 promise1 的 then,其实就是将 promise2 的状态改变为 resolve 态。promise2 的 链式调用(相当于使用 then 注册的回调) 就是执行。调用 func 之后,我们期待的行为是这样的。也就是上面说的恢复执行函数。

weixin_43233774的博客 1034

VC中sqlite的使用

在VC中对sqlite的使用,实现数据库大批数据的快速插入,读取数据库中的数据在ListCtrl中显示

编译并使用QuickJS(C++项目)

这个方法的第一个参数是这个JS方法的运行上下文,第二个参数是执行当前方法的JS对象,第三个参数是这个JS方法的参数数量,第四个参数是这个JS方法的参数数组。我们知道JavaScript在浏览器或Node.js里运行时,都有一些全局对象,比如:window,console等。JSContext是JavaScript脚本的运行上下文对象,它负责管理脚本执行相关的所有状态及作用域,,具体怎么在项目中用这个库,我就不多介绍了,下面介绍一下怎么在C++项目中使用QuickJS。编译成功之后,你会得到qjs.lib。

liulun的博客 1113

怀旧版电脑GBC模拟器

再现原版GBC掌机的界面,电脑运行连游戏界面都一样大小,很怀旧,很真实,(英文版)强烈推荐,很小的文件,很难才找到的。

JS中open()函数介绍!

window=object.open([URL ][, name ][, features ][, replace]]]])URL:新窗口的URL地址name:新窗口的名称,可以为空featurse:属性控制字符串,在此控制窗口的各种属性,属性之间以逗号隔开。fullscreen={ yes/no/1/0 }是否全屏,默认nochannelmode={ yes/no/1/0 } 是否显示频道栏,默

清风地带 3751

QuickJS 引擎一年见闻录

编者按:本文转载自知乎专栏《前端随想录》,快来一起学习吧!时间过得真快,转眼间 QuickJS 引擎已经发布一年了。一年来,围绕着它都发生了些什么呢?这篇文章会以一名普通社区用户的视角,...

奇舞周刊 2679

quickJS 说明

过一段时间可能要用qjs,参考着github上的中文翻译再加上自己的机翻整理了一下。 慢慢来吧 quickJS JavaScript引擎 1. 简介 QuickJS是一个小型并且可嵌入的Javascript引擎,它支持ES2020规范,包括模块,异步生成器和代理器。 它可选支持数学扩展,例如大整数 (BigInt),大浮点数 (BigFloat) 以及运算符重载。 1.1 主要特性 轻量而且易于嵌入:只需几个C文件,没有外部依赖,一个x86下的简单的“hello world”程序只要180 KiB。 具有

Nick_Di的博客 3620

javascript:d3.js 读取csv , 画折线图

参考 https://blog.youkuaiyun.com/github_37483541/article/details/54934158 d3_csv_line1.html <!DOCTYPE html> <html> <head> <meta charset='gb2312' /> <script src="/d3/d3.v3.min.js"&...

belldeep的专栏 4607

java : mozilla rhino js引擎 使用教程

https://mozilla.github.io/rhino/ 下载 rhino1_7R5.zip , 解压后运行 cmd cd D:\rhino\rhino1_7R5 先测试最简单的: java -jar js.jar swing1.js var SwingGui = new JavaImporter(javax.swing, javax.swing.event, javax.swin...

belldeep的专栏 2696

vue:vite 代理服务器 server: proxy 配置

vue 3:vite 代理服务器 server: {proxy: 配置};还有 http-proxy-middleware

belldeep的专栏 2303

javascript:echarts 画基金周K线图

以广发双擎升级混合基金 (005911)为例 W005911.html <!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <title> echarts Kline </title> <!-- 引入ECharts文件 --> ...

belldeep的专栏 1700

RGraph : svg : 玫瑰图

www.rgraph.net 下载 RGraph.minified-2018-08-14.zip 解压后,将目录 libraries 简化为: lib rose图例子: RGraph/svg_rose1.html [code="html"] RGraph : SVG rose charts API ...

belldeep的专栏 1653

vite:npm 安装 pdfjs-dist , PDF.js View 预览功能示例

pdfjs-dist 是 Mozilla 的 PDF.js 库的预构建版本,能让你在项目里展示 PDF 文件。

belldeep的专栏 1633

node.js 使用 elementtree 生成思维导图 Freemind 文件

node.js 读目录.txt文件,使用 elementtree 生成思维导图 Freemind(.mm)文件

belldeep的专栏 1568
上一篇: QuickJS 在生物化学计算中的应用
下一篇: WSL 安装 Debian 12 后,Linux 如何安装 curl , quickjs ?
belldeep
博客等级 码龄20年 1820粉丝 584原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值