微信小程序 - 文件工具类 fileUtil.js

微信小程序 - 文件工具类 fileUtil.js

const fs = wx.getFileSystemManager();/*** 选择媒体附魔的ZIP* @param {object} options */
function chooseMediaZip(options = {}){const defaultOptions = { count: 9, mediaType: ['image']};let params = {...defaultOptions, ...options};return wx.chooseMedia(params) // 选择 *.zip.png 文件.then(res=>{ // png 处理为 zipreturn res.tempFiles.map(file => {/* 这是附魔的bat脚本,在zip前添加了25个字节,是一个PNG文件的头:89504E470D0A1A0A0000000D49484452 转成的 base64echo iVBORw0KGgoAAAANSUhEUg==>_________copy /b _________ + /b %1 %~nx1.pngdel /q _________*/// 读取zip的二进制部分const arrayBuffer  = readFileSync(file.tempFilePath, '', 26);console.log(arrayBuffer);// 写 zip 到目录 globalData.PATH.zippngconst zipFile = {};zipFile.name = `${Date.now()}.zip`;zipFile.path =`${ params.zippng }/${ zipFile.name }`;mkdir(params.zippng); // 先创建目录writeFileSync( zipFile.path, arrayBuffer, 'binary' ); // 写 zip 文件return zipFile; // {name: 'fileName', path: 'http://xxx.png'}});}).catch(console.error);
}/*** 选择媒体文件* @param {object} options */
function chooseMedia(options = {}){const defaultOptions = { count: 9, mediaType: ['image']};return wx.chooseMedia({...defaultOptions, ...options});
}/*** 从聊天中选择文件* @param {number} _count */
function chooseFile(_count){return wx.chooseMessageFile({ count: _count }).then( res => {//  res 内容: {//     "errMsg":"chooseMessageFile:ok",//     "tempFiles":[//       {//         "name":"spineboy.zip",//         "size":273679,//         "time":1692946544,//         "path":"http://tmp/eZhBTvHhtCEN1328314d91c79395dce640b2f2aba2e7.zip",//         "type":"file"//       }//     ]//   }if(res.errMsg === "chooseMessageFile:ok"){return res.tempFiles;}else{return [];}});
}/*** 获取目录结构* @param {string} rootPath */
function ls(rootPath) {  // 检查目录是否存在  if(!isExist(rootPath)){return [];}let list = fs.statSync(`${rootPath}`, true);if(Array.isArray(list) == false && list.isDirectory()) {return [];}// 返回一个对象包含 dirPath 目录下的文件和子目录:{'file':[], 'dir': []}return list.map(df => {df.type = df.stats.isFile() ? 'file' : 'dir';return df;}).reduce((result, item) => {item.path = `${rootPath}/${item.path}`;result[item.type].push(item);return result;}, {'file':[], 'dir': []});
}/*** 删除文件(同步版)* @param {string} filePath 文件路径*/
function unlinkSync(filePath){if(isExist(filePath) == false){console.log(`文件不存在:${filePath}`)return;}try {const res = fs.unlinkSync(filePath);console.log(res)} catch(e) {console.error(e)}
}/*** 清空目录:包含所有子目录和文件* @param {string} rootPath 要清空的目录* @param {*} saveSelf      是否删除自己。为 false 则只清空其实的子目录和文件,但保留自己*/
function clearDir(rootPath, saveSelf=true) {  // 检查目录是否存在  if(!isExist(rootPath)){return;}// 获取:文件与子目录let group = ls(rootPath);if(Array.isArray(group.file) == false){ // 如果file属性不是一个数组,说明没查到东西。是个空文件夹。return;}// 删除所有文件let p = group.file.map(f => {return new Promise((resolve, reject) => {fs.unlink({filePath: f.path,success: res => resolve(res),fail: err => reject(err)})});});// 删除全部文件后,再执行删除目录。Promise.all(p).then(res => {fs.rmdir({dirPath: `${rootPath}`,recursive: true,success: res => console.log(res),fail: err => console.error(err),});});// 上面是直接递归删除整个目录,包括自己。这里判断一下,如果需要保留根目录,就再创建一下。if(saveSelf){mkdir(rootPath);}
}/*** 清空目录(同步版):包含所有子目录和文件* @param {string} rootPath 要清空的目录* @param {*} saveSelf      是否删除自己。为 false 则只清空其实的子目录和文件,但保留自己*/
function clearDirSync(rootPath, saveSelf=true) {  // 检查目录是否存在  if(!isExist(rootPath)){return;}// 获取:文件与子目录let group = ls(rootPath);if(Array.isArray(group.file) == false){ // 如果file属性不是一个数组,说明没查到东西。是个空文件夹。return;}// 删除所有文件group.file.map(f => fs.unlinkSync(f.path));// 递归删除全部目录。fs.rmdirSync(rootPath, true);// 上面是直接递归删除整个目录,包括自己。这里判断一下,如果需要保留根目录,就再创建一下。if(saveSelf){mkdir(rootPath);}
}/*** 清空目录下的文件(同步版)(只删除文件)* @param {string} rootPath 要清空的目录* @returns 被删除的文件列表*/
function clearFilesSync(rootPath) {  try {// 获取目录下的文件列表const files = fs.readdirSync(rootPath);// 删除所有文件files.forEach(path => fs.unlinkSync(`${rootPath}/${path}`));return files;} catch (error) {console.error(error);}
}/*** 判断文件或目录是否存在* @param {string} path 文件或目录路径*/
function isExist(path){try {fs.accessSync(path);return true;} catch (err) {console.log(`文件或目录不存在:${err.message}`);return false;}
}
/*** 创建目录路* 如果目录不存在就创建。* @param {string} dirPath 文件夹路径* @param {boolean} recursive 如果上级目录不存在,是否自动创建。默认:是*/
function mkdir(path, recursive = true){if(isExist(path) == false){                       // 判断目录是否存在fs.mkdirSync(path, recursive);                  // 如果没有就创建}
}/*** 删除目录* @param {string} path 要删除的目录路径 (本地路径) * @param {boolean} recursive 是否递归删除目录。如果为 true,则删除该目录和该目录下的所有子目录以及文件*/
function rmdirSync(path, recursive=false){if(isExist(path)){                       // 判断目录是否存在fs.rmdirSync(path, recursive);            // 如果存在就删除}
}/*** 为文件名添加编号后缀* @param {*} fileName      原文件名* @param {*} suffixNumber  编号* @param {*} suffixLen     编号位数*/
function addSuffixNumber(fileName, suffixNumber, suffixLen) {// 获取文件名与扩展名let extension = '';  let index = fileName.lastIndexOf('.');  if (index !== -1) {  extension = fileName.substring(index);  fileName = fileName.substring(0, index);  }  // 计算后缀序号的位数  let suffixLength = Math.floor(Math.log10(suffixLen)) + 1;// 对后缀编号进行高位补零  let paddedSuffixNumber = String(suffixNumber).padStart(suffixLength, '0');  // 返回新的文件名  return `${fileName}_${paddedSuffixNumber}${extension}`;  
}/*** 高位补零* @param {*} num       需要补零的序号* @param {*} count     序号所在序列中,的总数。用于计算要补几位* @param {*} suffixStr 自定补啥字符*/
function padNumber(num, count=10, suffixStr='0') {// 计算后缀序号的位数  let suffixLength = Math.floor(Math.log10(count)) + 1;// 对后缀编号进行高位补零  return String(num).padStart(suffixLength, suffixStr);  
}/*** 解析文件路径返回:{路径、全名、文件名、扩展名}* @param {*} filePath 文件路径*/
function getFileInfo(filePath) {  // 获取文件夹路径  const folderPath = filePath.substring(0, filePath.lastIndexOf('/') + 1);// 获取文件名  const fileName = filePath.substring(folderPath.length, filePath.lastIndexOf('.'));// 获取扩展名  const fileExtension = filePath.substring(filePath.lastIndexOf('.') + 1);return {  path: folderPath,  fullName: `${fileName}.${fileExtension}`,name: fileName,  extension: fileExtension  };  
}/*** 读取本地文件内容。单个文件大小上限为100M。* @param {*} filePath 文件路径。要读取的文件的路径 (本地路径)* @param {*} encoding 指定读取文件的字符编码,如果不传 encoding,则以 ArrayBuffer 格式读取文件的二进制内容* @param {*} position 默认从0开始读取。左闭右开区间 [position, position+length)。有效范围:[0, fileLength - 1]。单位:byte* @param {*} length   指定文件的长度,如果不指定,则读到文件末尾。有效范围:[1, fileLength]。单位:byte*/
function readFileSync(filePath, encoding='', position=0, length) {  return fs.readFileSync(filePath, encoding, position, length);
}/*** 写文件* @param {*} filePath 文件路径。要写入的文件路径 (本地路径)* @param {*} data 要写入的文本或二进制数据* @param {*} encoding 指定写入文件的字符编码。默认 binary*/
function writeFileSync(filePath, data, encoding='binary') {  fs.writeFileSync(filePath, data, encoding);
}module.exports = {fs,chooseMediaZip,chooseMedia,chooseFile,ls,unlinkSync,clearDir,clearDirSync,clearFilesSync,isExist,mkdir,rmdirSync,addSuffixNumber,padNumber,readFileSync,writeFileSync
};

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

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

相关文章

GO设计模式——14、代理模式(结构型)

目录 代理模式(Proxy Pattern) 代理模式的核心角色: 优缺点 使用场景 注意事项 代码实现 代理模式(Proxy Pattern) 代理模式(Proxy Pattern)通过引入代理对象来控制对真实对象的访问。 代…

Mybatis一级缓存与二级缓存

一、简介 数据库接收到sql语句后,需要词法/语法解析,优化sql语句,制定执行计划。多数情况下,相同的sql语句可能只是传入参数不同(如where条件后的值不同...)。 如果每次都需要经过上面的 词法/语法解析、语…

java基础之异常处理

1、概念 异常是程序中的一些错误,但并不是所有的错误都是异常,并且错误有时候是可以避免的。 2、异常发生的原因 用户输入了非法数据。要打开的文件不存在。网络通信时连接中断,或者JVM内存溢出。 3、三种类型的异常 检查性异常:…

Unity UGUI TextMeshPro实现输入中文和表情包(Emoji)表情

目录 实现中文显示 准备工作 1、打开Window——TextMeshPro——FontAssetCreator 2、把字体文件放入SourceFont中 3、把CharacterSet改为Characters from File 4、把字体库文件放入Characters File 5、设置好参数点击Generate Font Atlas等待完成后保存 6、把生成后保存…

科普小知识-3D 打印是什么?

3D 打印是什么?作为近年来备受关注的前沿科技,3D 打印技术正在不断改变着制造业、医疗领域、艺术设计等多个领域的面貌。其又被称为增材制造,是一种通过电脑设计,逐层堆叠材料来创建三维物体的技术。 3D 打印的基本原理 3D 打印…

【Ajax】发送get请求获取接口数据

编写html实现通过Ajax发送get请求并获取数据 代码实现 <!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><meta name"viewport" content"widthdevice-width, initial-scale1.0"><title…

LinuxBasicsForHackers笔记 -- 管理用户环境变量

查看和修改环境变量 env – 您可以通过从任何目录在终端中输入 env 来查看所有默认环境变量。环境变量的名称始终为大写&#xff0c;如 HOME、PATH、SHELL 等。 查看所有环境变量 set – 查看所有环境变量&#xff0c;包括 shell 变量、局部变量和 shell 函数&#xff08;例…

2. PyTorch——Tensor和Numpy

2.1Tensor和Numpy Tensor和Numpy数组之间具有很高的相似性&#xff0c;彼此之间的互操作也非常简单高效。需要注意的是&#xff0c;Numpy和Tensor共享内存。由于Numpy历史悠久&#xff0c;支持丰富的操作&#xff0c;所以当遇到Tensor不支持的操作时&#xff0c;可先转成Numpy…

conda配置不同版本的python及依赖库--conda conda conda

一、conda介绍 Conda 是一个开源的软件包管理系统和环境管理系统&#xff0c;用于安装多个不同版本的软件包及其依赖关系&#xff0c;并在它们之间轻松切换。 Conda 是为 Python 程序创建的&#xff0c;适用于 Linux&#xff0c;OS X 和Windows Conda可以构建不同的环境&#…

【计算机网络学习之路】HTTP响应报文Cookie原理

目录 HTTP响应报文格式 一. 状态行 状态码与状态码描述 二. 响应头 Cookie原理 一. 前因 二. Cookie的状态管理 结束语 HTTP响应报文格式 HTTP响应报文分为四部分 状态行&#xff1a;包含三部分&#xff1a;协议版本&#xff0c;状态码&#xff0c;状态码描述响应头&a…

企业计算机服务器中了mallox勒索病毒如何处理,Mallox勒索病毒解密

随着计算机技术的不断发展&#xff0c;越来越多的企业利用网络来提高工作效率&#xff0c;但随之而来的网络安全威胁也在不断增加&#xff0c;各种勒索病毒种类不断增加&#xff0c;给企业的数据安全带来严重的威胁&#xff0c;影响企业的生产业务开展。近期&#xff0c;云天数…

什么是css初始化

什么是css初始化 CSS初始化是指重设浏览器的样式。 因为浏览器的兼容问题&#xff0c;不同浏览器对有些标签的默认值是不同的&#xff0c;如果没对CSS初始化往往会出现浏览器之间的页面显示差异。 每次新开发网站或新网页时候通过初始化CSS样式的属性&#xff0c;为我们将用…

opencv的图像直方图处理

1 opencv的直方图 1.1 什么是直方图 直方图是对数据进行统计的一种方法&#xff0c;用于显示数据中各个数值或数值范围的分布情况。它将数据划分为一系列的区间&#xff08;也称为“箱子”或“bin”&#xff09;&#xff0c;然后统计每个区间中数据出现的频次&#xff08;或频…

用心整理的免费API集合

快递物流订阅与推送&#xff08;含物流轨迹&#xff09;&#xff1a;【物流订阅与推送、H5物流轨迹、单号识别】支持单号的订阅与推送&#xff0c;订阅国内物流信息&#xff0c;当信息有变化时&#xff0c;推送到您的回调地址。地图轨迹支持在地图中展示包裹运输轨迹。包括顺丰…

Flink-源算子-读取数据的几种方式

Flink可以从各种来源获取数据&#xff0c;然后构建DataStream进行转换处理。一般将数据的输入来源称为数据源&#xff08;data source&#xff09;&#xff0c;而读取数据的算子就是源算子&#xff08;source operator&#xff09;。所以&#xff0c;source就是我们整个处理程序…

微服务2 Docker学习 P42-P60

Docker学习视频https://www.bilibili.com/video/BV1LQ4y127n4?p42&vd_source8665d6da33d4e2277ca40f03210fe53a 文档资料: 链接&#xff1a;https://pan.baidu.com/s/1P_Ag1BYiPaF52EI19A0YRw?pwdd03r 提取码&#xff1a;d03r Docker 其他笔记 服务器容器化-docker(全…

CSS3 属性: transition过渡 与 transform动画

CSS3 提供了很多强大的功能&#xff0c;使开发人员可以创建更加吸引人的视觉效果&#xff0c;而不需要依赖于 JavaScript 或 Flash。其中&#xff0c;transition 和 transform 是两个常用的属性&#xff0c;它们分别用于创建平滑的过渡效果和元素的变形效果。下面我们将详细介绍…

redis-学习笔记(list)

因为 list 可以头插头删, 尾插尾删, 所以其实更像 C 中的 deque (双端队列) ---- 知道就好, 别乱说, 具体底层编码是啥, 俺也不知道(没注意过) 可以通过组合, 把 list 当作队列 / 栈来用 list 的几种底层编码: ziplist(压缩列表) , linkedlist(链表) , quicklist ziplist 就是将…

第62天:django学习(十一)

cookie和session 发展史 一开始,只有一个页面&#xff0c;没有登录功能&#xff0c;大家看到东西都一样。 时代发展&#xff0c;出现了需要登录注册的网站&#xff0c;要有一门技术存储我们的登录信息&#xff0c;于是cookie诞生了。 cookie: - 存储形式&#xff1a;k:v键值对…

渗透测试工具Nmap的深度解析

在当今数字化时代&#xff0c;网络安全已经成为了企业和个人必须关注的重要问题。为了确保网络的安全&#xff0c;我们需要使用各种工具和技术进行检测和防护。其中&#xff0c;渗透测试是一种非常重要的方法&#xff0c;它可以帮助我们发现网络中的安全漏洞&#xff0c;并采取…