找回密码
 注册
搜索
系统gho:最纯净好用系统下载站投放广告、加入VIP会员,请联系 微信:wuyouceo
查看: 165|回复: 4

办公软件WPS的JSA中进行文件操作

[复制链接]
发表于 前天 17:56 | 显示全部楼层 |阅读模式
办公软件WPS的表格:通过ExecuteExcel4Macro调用WinAPI实现
复制删除移动改名

对此贴的扩展,并写成单独的函数:办公软件WPS的JSA中删除文件入回收站
  1. function 复制文件测试(){
  2.         let 源文件名='D:\\abc.txt';
  3.         let 目标文件名='D:\\批处理\\xyz.ini';
  4.         let 复制结果=复制文件(源文件名,目标文件名);
  5.         console.clear();
  6.         if(!复制结果){console.log("复制成功。");}else{console.log("复制失败!"+复制结果);}
  7. }
  8. function 删除文件测试(){
  9.         let 文件名='D:\\abc.txt';
  10.         let 删除结果=删除文件(文件名);
  11.         console.clear();
  12.         if(!删除结果){console.log("删除成功。");}else{console.log("删除失败!"+删除结果);}
  13. }
  14. function 移动文件测试(){
  15.         let 源文件名='D:\\abc.txt';
  16.         let 目标文件名='D:\\批处理\\xyz.ini';        //let 目标文件名='D:\\批处理\\xyz.ini';
  17.         let 移动结果=移动文件(源文件名,目标文件名);
  18.         console.clear();
  19.         if(!移动结果){console.log("移动成功。");}else{console.log("移动失败!"+移动结果);}
  20. }
  21. function 文件改名测试(){        //必须是在同目录
  22.         let 原文件名='D:\\abc.txt';
  23.         let 新文件名='D:\\xyz.ini';        //let 新文件名='D:\\批处理\\xyz.ini';
  24.         let 改名结果=文件改名(原文件名,新文件名);
  25.         console.clear();
  26.         if(!改名结果){console.log("改名成功。");}else{console.log("改名失败!"+改名结果);}
  27. }

  28. function 复制文件(源文件名,目标文件名){        //源与目标均用完整路径
  29.         let 源文件名字节数=源文件名.replace(/[^\x00-\xff]/g,'xx').length;
  30.         let 目标文件名字节数=目标文件名.replace(/[^\x00-\xff]/g,'xx').length;
  31.         let 申请源内存大小=源文件名字节数+2,申请目标内存大小=目标文件名字节数+2;
  32.        
  33.         let 源内存句柄=申请本地内存(申请源内存大小);
  34.         let 源内存地址=锁定本地内存(源内存句柄);
  35.         字符串写入内存(源文件名,源内存地址);        //源文件名写入内存
  36.         解锁本地内存(源内存句柄);
  37.        
  38.         let 目标内存句柄=申请本地内存(申请目标内存大小);
  39.         let 目标内存地址=锁定本地内存(目标内存句柄);
  40.         字符串写入内存(目标文件名,目标内存地址);        //目标文件名写入内存
  41.         解锁本地内存(目标内存句柄);
  42.        
  43.         let 复制=2,删除=3,移动=1,改名=4;
  44.         let 允许撤销=不显示错误=0x40,无需确认=0x10,不显示进度=4,直建目录=0x200;
  45.         let 复制文件操作结构=[0,复制,源内存地址,目标内存地址,允许撤销|无需确认|不显示进度|直建目录,0,0,0];
  46.         let 复制结果=文件操作(复制文件操作结构);
  47.        
  48.         释放本地内存(目标内存句柄);释放本地内存(源内存句柄);
  49.         return 复制结果;
  50. }
  51. function 删除文件(文件名){        //文件/目录用完整路径
  52.         let 文件名字节数=文件名.replace(/[^\x00-\xff]/g,'xx').length;
  53.         let 申请内存大小=文件名字节数+2;
  54.        
  55.         let 内存句柄=申请本地内存(申请内存大小);
  56.         let 内存地址=锁定本地内存(内存句柄);
  57.         字符串写入内存(文件名,内存地址);        //源文件名写入内存
  58.         解锁本地内存(内存句柄);
  59.        
  60.         let 删除=3,移动=1,改名=4;
  61.         let 允许撤销=不显示错误=0x40,无需确认=0x10,不显示进度=4;
  62.         let 删除文件操作结构=[0,删除,内存地址,0,允许撤销|无需确认|不显示进度,0,0,0];
  63.         let 删除结果=文件操作(删除文件操作结构);
  64.        
  65.         释放本地内存(内存句柄);
  66.         return 删除结果;
  67. }
  68. function 移动文件(源文件名,目标文件名){        //源与目标均用完整路径
  69.         let 源文件名字节数=源文件名.replace(/[^\x00-\xff]/g,'xx').length;
  70.         let 目标文件名字节数=目标文件名.replace(/[^\x00-\xff]/g,'xx').length;
  71.         let 申请源内存大小=源文件名字节数+2,申请目标内存大小=目标文件名字节数+2;
  72.        
  73.         let 源内存句柄=申请本地内存(申请源内存大小);
  74.         let 源内存地址=锁定本地内存(源内存句柄);
  75.         字符串写入内存(源文件名,源内存地址);        //源文件名写入内存
  76.         解锁本地内存(源内存句柄);
  77.        
  78.         let 目标内存句柄=申请本地内存(申请目标内存大小);
  79.         let 目标内存地址=锁定本地内存(目标内存句柄);
  80.         字符串写入内存(目标文件名,目标内存地址);        //目标文件名写入内存
  81.         解锁本地内存(目标内存句柄);
  82.        
  83.         let 移动=1,改名=4;
  84.         let 允许撤销=不显示错误=0x40,无需确认=0x10,不显示进度=4,直建目录=0x200;
  85.         let 移动文件操作结构=[0,移动,源内存地址,目标内存地址,允许撤销|无需确认|不显示进度|直建目录,0,0,0];
  86.         let 移动结果=文件操作(移动文件操作结构);
  87.        
  88.         释放本地内存(目标内存句柄);释放本地内存(源内存句柄);
  89.         return 移动结果;
  90. }
  91. function 文件改名(原文件名,新文件名){        //均用完整路径,必须在同目录下
  92.         let 原文件名字节数=原文件名.replace(/[^\x00-\xff]/g,'xx').length;
  93.         let 新文件名字节数=新文件名.replace(/[^\x00-\xff]/g,'xx').length;
  94.         let 申请原内存大小=原文件名字节数+2,申请新内存大小=新文件名字节数+2;
  95.        
  96.         let 原内存句柄=申请本地内存(申请原内存大小);
  97.         let 原内存地址=锁定本地内存(原内存句柄);
  98.         字符串写入内存(原文件名,原内存地址);        //原文件名写入内存
  99.         解锁本地内存(原内存句柄);
  100.        
  101.         let 新内存句柄=申请本地内存(申请新内存大小);
  102.         let 新内存地址=锁定本地内存(新内存句柄);
  103.         字符串写入内存(新文件名,新内存地址);        //新文件名写入内存
  104.         解锁本地内存(新内存句柄);
  105.        
  106.         let 移动=1,改名=4;let 目标已存在=8;
  107.         let 允许撤销=不显示错误=0x40,无需确认=0x10,不显示进度=4,直建目录=0x200;
  108.         let 文件改名操作结构=[0,改名,原内存地址,新内存地址,允许撤销|无需确认|不显示进度,0,0,0];
  109.         let 改名结果=文件操作(文件改名操作结构);
  110.        
  111.         释放本地内存(新内存句柄);释放本地内存(原内存句柄);
  112.         return 改名结果;
  113. }

  114. function 文件操作(操作数组){        //复制、删除、移动、改名
  115.         const 执行宏调用=ExecuteExcel4Macro;
  116.         let 内存句柄=申请本地内存(4*8);        //文件操作结构:4字节*8
  117.         let 内存地址=锁定本地内存(内存句柄);
  118.         数组写入内存(内存地址,操作数组);
  119.         解锁本地内存(内存句柄);
  120.        
  121.         内存地址=锁定本地内存(内存句柄);
  122.         let 操作结果=执行宏调用(`CALL("Shell32","SHFileOperationA","JJ",${内存地址})`);        //执行文件操作
  123.         解锁本地内存(内存句柄);释放本地内存(内存句柄);
  124.         return 操作结果;
  125. }
  126. function 字符串写入内存(字符串,内存地址){
  127.         const 执行宏调用=ExecuteExcel4Macro;
  128.         let 分段文本=[],分段字节=[],总字节=0,段长度=127;
  129.         for(let 起始=i=0;起始<字符串.length;起始+=段长度,i++){
  130.                 分段文本.push(字符串.slice(起始,起始+段长度));
  131.                 分段字节.push(分段文本[i].replace(/[^\x00-\xff]/g,'xx').length);        //一汉字占俩字节
  132.                 总字节+=分段字节[i];
  133.         }
  134.         for(let 偏移字节=i=0;i<分段文本.length;i++){        //内存使用限长,字符串分批复制
  135.                 执行宏调用(`CALL("Kernel32","lstrcpynW","JJFJ",${内存地址+偏移字节},"${分段文本[i].replace(/"/g,'""')}",${分段字节[i]})`);
  136.                 偏移字节+=分段字节[i];
  137.         }
  138. }
  139. function 数组写入内存(内存地址,数组){
  140.         const 执行宏调用=ExecuteExcel4Macro,写入字节=4;
  141.         for(let 偏移=i=0;i<数组.length;i++){        //写入
  142.                 执行宏调用(`CALL("Kernel32","RtlMoveMemory","2JNJ",${内存地址+偏移},${数组[i]},${写入字节})`);
  143.                 偏移+=写入字节;
  144.         }
  145. }
  146. function 申请本地内存(字节数){        //返回内存句柄
  147.         const 执行宏调用=ExecuteExcel4Macro;
  148.         const 内存句柄=执行宏调用(`CALL("Kernel32","LocalAlloc","JJJ",2,${字节数})`);
  149.         if(内存句柄){
  150.                 return 内存句柄;
  151.         }else{console.log("未能分配内存!");}
  152. }
  153. function 释放本地内存(内存句柄){
  154.         const 执行宏调用=ExecuteExcel4Macro;
  155.         执行宏调用(`CALL("Kernel32","LocalFree","JJ",${内存句柄})`);        //释放内存
  156. }
  157. function 锁定本地内存(内存句柄){        //返回内存地址
  158.         const 执行宏调用=ExecuteExcel4Macro;
  159.         const 内存地址=执行宏调用(`CALL("Kernel32","LocalLock","JJ",${内存句柄})`);
  160.         if(内存地址){
  161.                 return 内存地址;
  162.         }else{console.log("未找到内存地址!");}
  163. }
  164. function 解锁本地内存(内存句柄){
  165.         const 执行宏调用=ExecuteExcel4Macro;
  166.         执行宏调用(`CALL("Kernel32","LocalUnlock","JJ",${内存句柄})`);        //解锁
  167. }
复制代码
 楼主| 发表于 前天 17:59 | 显示全部楼层
以上四个操作可撤消。
回复

使用道具 举报

发表于 前天 18:47 | 显示全部楼层
支持支持,谢谢
回复

使用道具 举报

发表于 前天 23:02 | 显示全部楼层
回复

使用道具 举报

发表于 昨天 05:55 | 显示全部楼层
没使用过不了解。
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则

小黑屋|手机版|Archiver|捐助支持|无忧启动 ( 闽ICP备05002490号-1|闽公网安备35020302032614号 )

GMT+8, 2026-5-13 06:15

Powered by Discuz! X5.0

© 2001-2026 Discuz! Team.

快速回复 返回顶部 返回列表