紫猫插件-文件读写(1-13)
Posted zjl8455482
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了紫猫插件-文件读写(1-13)相关的知识,希望对你有一定的参考价值。
QM[zm]05.01 文件读写之读取乱码文件(VIP)
小知识:了解下base64编码(功能就目前而言只是让内容无法直接读取 还有一个常用用处是可以把图片的二进制流base64编码 把图片作为字符串来传输 实际上稍微懂一点这方面的知识的很容易看到真实的内容)
举个例子 比如迅雷下载地址
我们把第一行的字符串进行base64解码 得到的结果是
很明显 迅雷对下载地址进行了保护 算法无非就是 给真正的下载地址左侧加AA右侧加ZZ 然后整体bse64加密 得到了我们看到的迅雷下载地址
顺便说一下 我们平时在网页上增加图片链接 一般是这样<img src=“http://www.letuknowit.com/images/wg.png”/> 这样的话 每次打开这个网页 网页还要分出资源加载各种图片 如果我们把图片的二进制流直接base64处理 就相当于 我们把这个图像直接放到了网页上 图片本体就是在网页上 根本不需要加载 例如这样
顺便附上 base64图片转化地址 自己测试就好http://imgbase64.duoshitong.com/
base64的详细资料 https://blog.csdn.net/goodlixueyong/article/details/52132250
base64在图片领域的使用 https://www.aimks.com/css-path-data-image-png-usage-base64.html
小知识:这节课主要是简单介绍了下 中文乱码出现原因
电脑上的txt默认编码为ansi 但是呢 手机上的txt默认编码为utf8 ansi包含的是英文符号和基础字符 但是不包含中文
解决办法:用紫猫插件的文件读写函数 编码参数为电脑就可以 但是注意 当前txt的编码格式必须为ansi 编码参数才能用 电脑 值 还有另外一个办法 把txt的编码格式转化为utf8保存下 就什么屁事也没有了
小知识:zm.readfile()函数
用法和默认的readfile基本一样 只是多了一个参数 zm.readfile(path,”电脑”) 第二个参数为电脑 则它认为txt是ansi编码 注意 当前txt的编码格式必须为ansi 编码参数才能用 电脑 值
源码:结果:
QM[zm]05.02 文件读写之解决开头问号字符(VIP)
小知识:为什么txt第一位有的时候出现一个问号 其实就是普通的txt文件会自带一个bom头 但是到了手机下 手机无法识别这个bom头 只能呈现一个问号
解决办法:
1.我原来的处理办法如下 核心思路无非就是把bom头的3个字符替换为空就解决了 bom头的3个字符就是Chr(239) & Chr(187) & Chr(191), 老师是视频里面的代码也是这样
Function 文本文件格式化操作(文件路径) Dim 读取内容 读取内容 = Trim(file.Read(文件路径)) //判断开头3个字符是否是bom头 If Mid(读取内容, 1, 3) = Chr(239) & Chr(187) & Chr(191) Then //有则替换为空 然后重新写入内容 这个地方不确定是否除了第一行之外还可能存在bom头 应该没那么巧 file.Write 文件路径, Replace(读取内容, Chr(239) & Chr(187) & Chr(191), "") End If //如果txt里面最后不是以 结尾的 就自动添加一个回车换行符 来实现这个 也解决了替换最后一行 不写 会替换找不到的情况 If trim(读取内容)<>""and Right(读取内容, 2) <> " " Then file.Write 文件路径, 读取内容 & " " End If End Function
2.直接用老师的紫猫插件的文件读取的函数 就可以自动过滤掉这些东西(推荐)
QM[zm]05.03 文件读写之读取帐号密码(VIP)
主要是讲解zm.FileReadForm( 用法 这个比较省事 可以直接把账号密码的若干信息直接分割好 不需要我们分割2次
源码如下
Import "zm.luae" zm.Init Dim 账号文件路径="/sdcard/Pictures/账号.txt" Dim 读取结果表=zm.FileReadForm(账号文件路径,"---","电脑") TracePrint zm.VarInfo(读取结果表) //遍历这个表 For i = 0 To UBOUND(读取结果表) TracePrint "账号:["&读取结果表(i,0)&"],密码:["&读取结果表(i,1)&"],状态{"&读取结果表(i,2)&"}" //TracePrint zm.VarInfo(读取结果表[i]) //TracePrint 读取结果表[i][0] Next
结果
原始的文件内容
注意:
1.按键里面table二维表的调用自身的元素是这样的形势 tablename(0,1) 而不是tablename[0][1] 推荐以后都用这个 能节约3行代码 而且自带去掉bom头 自适应编码等优点
2.表的数字索引从0开始
QM[zm]05.04 文件读写之读取表格文本(VIP)
没有什么特殊的 还是继续讲解的zm.FileReadForm
zm.FileInit()----》参数是个表
zm.FileInit {"encode":"电脑"}
QM[zm]05.05 文件读写之按行读取(VIP)(好无聊 直接看文档即可)
zm.FileReadLines(path,“电脑”)用法基本和官方一致 无话可说
结果 = zm.FileReadLine(文本路径, 指定行[, 文件编码]) (平时不大用)
命令参数:
文件路径: 字符串, 要操作的文件路径
指定行: 数值型, 表示读取第几行内容, 负数为倒数第几行内容 有点意思
文件编码: 字符串, 可选, 填写"电脑"可以解决电脑文件乱码问题, 也可以填写`"auto"`实现自动识别文件编码, 但是会降低读写速度, 省略默认为初始化编码
小知识:将任意文件转化为字符串和将字符串还原为文件
(主要是图片文件 但是其他文件也是可以)
基本原理就是把文件以二进制形式读取出来 然后base64编码 等到一个字符串 还原为文件不过是相反的路子 这个很有用 很多文件这样的话都可以直接存储到数据库
注意:这样把文件转化为字符串并没有减少占用体积 反而是增加了占用体积 如果你的数据库的存储容量有限 就没有必要把这些文件都转化为字符串存储到数据库内
源码:
Import "zm.luae" zm.Init Dim 账号文件路径="/sdcard/Pictures/账号.txt" //图片和base64编码之间的相互转换 Dim 图片文件路径="/sdcard/Pictures/1.docx" dim b64 = zm.FileReadBinaryBase64(图片文件路径) TracePrint b64 zm.FileWriteBinaryBase64("/sdcard/Pictures/2.docx", b64)
结果:
QM[zm]05.06 文件读写之初始化文件编码(VIP)
因为涉及到txt的编码问题 建议文件的读写全用紫猫的插件
原因:比如写入 zm.FileWrite 可以设置 写入txt里面的内容 编码是什么 而官方的命令无法设置 如果混在一起使用 可能会出现一些问题 所以建议全用紫猫的
建议在模板里面加入这个格式配置
//固定的写法 Import "zm.luae" zm.Init zm.FileInit {"encode":"电脑"}//这个默认编码是对所有的紫猫插件的文件读写函数都有效 所以固定的要加上 //后面就是各种文件操作了
小知识:关于zm.FileInit{}的使用
如果不是显示定义该函数 那么默认就是 zm.FileInit{“encode”:”utf-8”} 如果txt文件是ansi编码 那么就需要设置为zm.FileInit{“encode”:”电脑”} 而且这个文件读写的初始化会影响到每个紫猫文件读写函数 切记切记
小知识:zm.FileWrite()的使用 另外一个就是普通的覆盖写入 没什么说的
有两种使用方法 一个是参数为表 覆盖写入txt后 表的每个元素都是一行
zm.FileWrite 账号文件路径,{"欢迎加入紫猫学院,", "紫猫老师QQ: 345911220 ", "免费交流群: 7333555"}
FileInit()初始化函数的设置 是相关的 如果初始化编码为utf8 那么filewrite写入表元素 之间是以 分隔 如果初始化函数设置编码为电脑 则filewrite写入表元素之间是以 分隔 这个十分要紧千万注意
QM[zm]05.08 文件读写之追加写入文件(VIP)
zm.FileWriteAppend(文件路径, ...) 还是和FIleInit()设置的编码相关 所以不用怎么说了
zm.FileWriteAppend 账号文件路径,{"欢迎加入紫猫学院,", "紫猫老师QQ: 345911220 ", "免费交流群: 7333555"}
QM[zm]05.09 文件读写之插入指定行文本(VIP)
跳过了
QM[zm]05.10 文件读写之替换指定行文本(VIP)
跳过了
QM[zm]05.11 文件读写之读写二进制流文本(VIP)
小知识:二进制流读取写入的作用
可以把文件转化为二进制字符串 也可以把二进制流字符串还原回文件 比如文件上传 文件移动等等 都可以用这个办法实现 但是 转化为二进制流后 里面存在大量不能视的符号 传输起来有的时候会 网络上有的时候无法传递一些字符 我们要保证这些二进制流字符串的稳定传递 那么需要用base64编码 传递这个所有字符都是可视的base64编码后的字符串
//固定的写法 Import "zm.luae" zm.Init zm.FileInit {"encode":"电脑"}//这个默认编码是对所有的紫猫插件的文件读写函数都有效 所以固定的要加上 //后面就是各种文件操作了 Dim 账号文件路径="/sdcard/Pictures/账号.txt" TracePrint zm.FileReadBinary(账号文件路径)
结果
看结果得到的二进制流字符串 有很多问号表示目前无法识别的字符 在传输期间可能会发生奇怪的无法识别更是存在可能 所以我们要用base64顺便编码下二进制流字符串
如上图 这样字符串就是全部都是英文字符和数字还有一些常见符号
但是千万注意 base64编码后 这字符串只会比原来更大更多 这个要小心 这就要考虑网站本身的post传输的下载上传的极限 有的时候文件过大 导致服务器消耗大量资源来传输 也可以调整网站的配置来调整 可以参考这个 https://blog.csdn.net/u013239233/article/details/78040794 来调整网站设置 同时字段类型设置为longtext
这个思路也是很多网站上传图片的思路 把该图片转化为二进制流 字符串 把字符串上传即可 而不是ftp把该文件本身上传
QM[zm]05.12 文件读写之读写Base64二进制流文本(VIP)
没什么说的 以前都说完了 无非是搭配 网络数据共享 把baase64编码的字符串 上传到数据库 然后从数据库里面读取图片的base64字符串 还原图片
源码:
Import "zm.luae" zm.Init zm.FileInit {"encode":"电脑"}//这个默认编码是对所有的紫猫插件的文件读写函数都有效 所以固定的要加上 Dim 网络数据库接口地址="http://192.168.0.102/sql.php" zm.NetDataInit 网络数据库接口地址, "上传图片" //开始 Dim 原始图片文件路径="/sdcard/Pictures/1.png" Dim 新图片文件路径="/sdcard/Pictures/4.png" dim 原始图片base64后字符串= zm.FileReadBinaryBase64(原始图片文件路径) Dim 当前数据库key=CStr(DateTime.Format("%Y_%m_%d_%H_%M_%S", Time())) zm.NetDataSet 当前数据库key, 原始图片base64后字符串 //把图片的base64字符串上传到服务器 zm.FileWriteBinaryBase64(新图片文件路径,zm.NetDataGet(当前数据库key)) //从服务器上把base64字符串下载下来 还原为一个图片
QM[zm]05.13 文件读写之网络数据传输图片等文件(VIP)
用途
1.远程截图 运行脚本 脚本把截图上传服务器 我们从服务器那里还原截图
自行开发 自己想
2.如果文件过大 我们可以用紫猫的split来把文件分割为几个 然后依次上传 key设置后面接一连串的数值
实际测试我发现 如果
目标文件是个4m的 那么我base64编码需要快40秒 这个效率没什么意思 了解下写法即可
//固定的写法 Import "zm.luae" zm.Init zm.FileInit {"encode":"电脑"}//这个默认编码是对所有的紫猫插件的文件读写函数都有效 所以固定的要加上 Dim 网络数据库接口地址="http://192.168.0.102/sql.php" zm.NetDataInit 网络数据库接口地址, "上传mqb" //开始 Dim 原始文件路径="/sdcard/Pictures/1.gif" Dim 新文件路径="/sdcard/Pictures/4.gif" dim 原始文件base64后字符串= zm.FileReadBinaryBase64(原始文件路径) TracePrint len(原始文件base64后字符串) //开始把这个4m文件分割为几块 dim 分割后的表 = zm.Split(原始文件base64后字符串, 100000) //开始上传 For i = 0 To UBOUND(分割后的表) zm.NetDataSet "gif文件"&cstr(i),分割后的表(i) Next //从数据库里面下载需要的key对应的内容 以mqb开始 0,1,2,3 如果遇到一个为空的表示 后面没有了 dim 汇总的数据 = "" Dim 临时数据1="" dim i=0 Do 临时数据1 = "" 临时数据1=zm.NetDataGet("gif文件"&cstr(i)) If IsNull(临时数据1) Then Exit Do //如果后面的key为空表示到头了 Else 汇总的数据=汇总的数据&临时数据1 End If i = i + 1 TracePrint i Loop TracePrint 汇总的数据 //把汇总的数据还原为文件 zm.FileWriteBinaryBase64(新文件路径,汇总的数据)
3.base64初始化的用法 默认用最普通的第一个
结果 = zm.InitBase64([字符表[, 填充符]])
简单的介绍下base64的3个不同模式
1.普通模式 不说了
2.安全模式 把普通模式的+ /转化为%XX 这个模式方便用于url传输 因为+/=之类的在url地址里有自己特殊的意义 所以必须转义
3.这种似乎用不上 不研究了 需要再百度
e123
以上是关于紫猫插件-文件读写(1-13)的主要内容,如果未能解决你的问题,请参考以下文章
[lua]紫猫lua教程-命令宝典-L1-01-01. Lua环境与IDE
Java-jxl插件Excel文件读写报错jxl.read.biff.BiffException: Unable to recognize OLE stream