VB6换个思路解决微信下载文件只读的问题(含源码)
日期:2023年3月10日
作者:Commas
签名:(ง •_•)ง 积跬步以致千里,积小流以成江海……
注释:如果您觉得有所帮助,帮忙点个赞,也可以关注我,我们一起成长;如果有不对的地方,还望各位大佬不吝赐教,谢谢^ - ^
1.01365 = 37.7834;0.99365 = 0.0255
1.02365 = 1377.4083;0.98365 = 0.0006

文章目录
- 一、前言
- 二、设置与取消文件只读权限
- 三、判断文件只读
- 四、实现过程
一、前言
当一个文件(Word、Excel、PPT等等)编辑的差不多了,准备保存的时候,哟,好家伙,发现该文件权限设置为只读(readonly)了,无法保存,心情突然没那么美丽了。其实很简单解决这个问题,如下所示:

右键选择“属性”→取消“只读”的勾选,那么example.docx文件就取消只读,可以正常保存了。另外还有什么压缩传输法,文件另存法,微信降级法等等,虽然可以解决问题,但是也太不方便了。
后面排查发现,原来是最近微信更新后出现的问题——微信传输的文件均被设置成了只读(readonly)权限,给出的说法是为了防止文件信息在网络传输过程中被篡改。但是也太不方便了吧,作为一名技术不能忍,于是乎搞出一个小程序chmod.exe,将这个exe放在微信下载文件夹下面,运行就可以把整个文件夹中所有的文件取消只读了,看下效果吧:
- 双击运行,效果如下:

- 再次双击运行,效果如下:

好了,话不多说,我们接下来讲讲如何实现吧……
最后面放了程序与源码的下载地址^ - ^
二、设置与取消文件只读权限
VB6中的VBA库提供了一个方法SetAttr(),可以设置文件的读写等等权限。
语法:
VBA.SetAttr(PathName As String,Attributes As VbFileAttribute)
或
SetAttr(PathName As String,Attributes As VbFileAttribute)
PathName:必要参数。需要修改只读属性的文件路径或目录路径;Attributes:必要参数。常数或数值表达式,其总和用来表示文件的属性;
attributes 参数设置可为:
| 常数 | 值 | 描述 |
|---|---|---|
vbNormal | 0 | 常规(缺省值),可读可写 |
vbReadOnly | 1 | 只读 |
vbHidden | 2 | 隐藏 |
vbSystem | 4 | 系统文件 |
vbArchive | 32 | 上次备份以后,文件已经改变 |
设置只读示例:
'set the file readoly
Call VBA.SetAttr(App.Path & "\example.txt",vbReadOnly)
或
'set the file readoly
Call VBA.SetAttr(App.Path & "\example.txt",1)
取消只读示例:
'cancel the file readonly
Call VBA.SetAttr(App.Path & "\example.txt", vbNormal)
或
'cancel the file readonly
Call VBA.SetAttr(App.Path & "\example.txt", 0)
三、判断文件只读
VB6中的VBA库提供了一个方法GetAttr(),可以设置文件的读写等等权限。
语法:
VBA.GetAttr(PathName As String) As VbFileAttribute
或
GetAttr(PathName As String) As VbFileAttribute
PathName:必要参数。需要修改只读属性的文件路径或目录路径;VbFileAttribute:返回值是一个 十进制 的Integer,此为一个文件、目录、或文件夹的属性值总和;
由 GetAttr 返回的值,是下面这些属性值的总和:
| 常数 | 值(十进制) | 值(二进制) | 描述 |
|---|---|---|---|
vbNormal | 0 | 0 | 常规 |
vbReadOnly | 1 | 1 | 只读 |
vbHidden | 2 | 10 | 隐藏 |
vbSystem | 4 | 100 | 系统文件 |
vbDirectory | 16 | 10000 | 目录或文件夹 |
vbArchive | 32 | 10000 | 上次备份以后,文件已经改变 |
vbalias | 64 | 1000000 | 指定的文件名是别名 |
特别说明
若要判断是否设置了某个属性,在 GetAttr 函数与想要得知的属性值之间使用 And 运算符与逐位比较。如果所得的结果不为零,则表示设置了这个属性值,即:
result = GetAttr(PathName) And VbFileAttribute
- 如果 result <> 0 ,那么表示设置
VbFileAttribute权限; - 如果 result = 0 ,那么没有设置
VbFileAttribute权限;
只读示例:
Dim result As Integer
result = GetAttr(App.Path & "\example.txt", 0) And vbReadOnly
If result <> 0 ThenDebug.Print "文件设置了只读权限"
ElseDebug.Print "文件未设置只读权限"
End If
只要result <> 0,就表示文件设置了只读权限,其中用到了一个【And 运算符与逐位比较 】知识点,如果读者感兴趣,那么到时候再出一期详细讲讲吧,这里展开讲解的话,可以话题就跑偏了。
上述判断文件权限,大部分习惯高级语言的小伙伴们都不太适应吧,所以我将其封装了下,健康绿色,可以放心食用,如下所示:
Private Function CheckFileReadOnly(ByVal sFilePath As String) As Boolean
On Error Resume Next
'函数说明:判断文件是否为只读
'创建作者:Commas
'创建时间:2022-02-16
'修改时间:
'------数据格式说明------
'sFilePath:文件路径
'------数据格式说明------CheckFileReadOnly = FalseIf sFilePath <> "" ThenIf Dir(sFilePath, vbDirectory + vbNormal + vbArchive + vbHidden + vbReadOnly + vbSystem) <> "" ThenIf (VBA.GetAttr(sFilePath) And vbReadOnly) <> 0 ThenCheckFileReadOnly = TrueEnd IfEnd IfEnd If
End Function
四、实现过程
现在我们实现的是一个文件的权限设置,如果就这么去取消只读权限,那还不如直接右键属性直接取消来的快,所以需要用到目录遍历(如果想详细了解这方面的知识,可以看我的另一篇博文《VB6遍历目录(文件夹和文件)》)。
首先,我们封装一下单个文件的取消只读权限
Private Function CancelFileReadOnly(ByVal sFilePath As String) As Boolean
On Error Resume Next
'函数说明:文件取消只读
'创建作者:Commas
'创建时间:2022-02-16
'修改时间:
'------数据格式说明------
'sFilePath:文件路径
'------数据格式说明------Err.ClearVBA.SetAttr sFilePath, vbNormalIf Err <> 0 ThenCancelFileReadOnly = FalseErr.ClearElseCancelFileReadOnly = TrueEnd If
End Function
然后,我们获取路径下的所有目录(文件夹目录+文件目录)
Set clnDir = GetAllDir(sFindPathName)
接着,我们遍历目录clnDir来取消文件只读
For i = 1 To clnDir.CountsCurFilePath = clnDir.Item(i)'判断文件是否未只读If CheckFileReadOnly(sCurFilePath) ThensCurFileName = Mid(sCurFilePath, InStrRev(sCurFilePath, "\") + 1)'取消文件只读权限If CancelFileReadOnly(sCurFilePath) ThenclnOK.Add sCurFileNameElseclnFail.Add sCurFileNameEnd IfEnd If
Next i
最后,将遍历过程封装成函数,即批量取消只读权限(BatchCancelFileReadOnly)
Private Function BatchCancelFileReadOnly(ByVal sFindPathName As String) As Boolean
On Error Resume Next
'函数说明:文件取消只读
'创建作者:Commas
'创建时间:2022-02-16
'修改时间:
'------数据格式说明------
'sFindPathName:文件夹路径
'------数据格式说明------Dim sCurFileName As String, sCurFilePath As String, i As LongDim clnOK As New Collection, clnFail As New Collection, clnDir As New Collection' 获取查询路径下所有目录(包括子孙)Set clnDir = GetAllDir(sFindPathName)For i = 1 To clnDir.CountsCurFilePath = clnDir.Item(i)'判断文件是否未只读If CheckFileReadOnly(sCurFilePath) ThensCurFileName = Mid(sCurFilePath, InStrRev(sCurFilePath, "\") + 1)'取消文件只读权限If CancelFileReadOnly(sCurFilePath) ThenclnOK.Add sCurFileNameElseclnFail.Add sCurFileNameEnd IfEnd IfNext iIf clnFail.Count = 0 ThenBatchCancelFileReadOnly = TrueElseBatchCancelFileReadOnly = FalseEnd IfDim sMsg As StringIf clnOK.Count > 0 Or clnFail.Count > 0 ThenaddMsg sMsg, "******操作完成,详情如下******"addMsg sMsg, "执行路径:" & sFindPathNameaddMsg sMsg, ""End If'okIf clnOK.Count > 0 ThenaddMsg sMsg, ""addMsg sMsg, "@@@@已取消【只读】的文件如下所示:"End IfFor i = 1 To clnOK.CountaddMsg sMsg, clnOK(i)Next'failIf clnFail.Count > 0 ThenaddMsg sMsg, ""addMsg sMsg, "@@@@取消【只读】失败的文件如下所示:"End IfFor i = 1 To clnFail.CountaddMsg sMsg, clnFail(i)NextIf sMsg = "" Then sMsg = "经检查,【路径" & sFindPathName & "】没有【只读】文件"MsgBox sMsg
End Function
调用示例:
Sub Main()Dim sPath As String'VBA.Command$ 也可以从命令行参数提取path,这里暂时没有实现sPath = App.PathDebug.Print BatchCancelFileReadOnly(sPath)
End Sub
顺便提一嘴,还可以做一个计时器,定时执行取消只读权限;或者监听文件变化,再执行批量取消,这样看上去就会更加便捷了,这个实现就留给聪明的你啦^ - ^
一、下载地址:
- 免费白嫖:https://download.csdn.net/download/qq_35844043/87548631
- 积分下载:https://download.csdn.net/download/qq_35844043/87548735
二、源码分享:
GitCode地址:https://gitcode.net/qq_35844043/vb6/-/tree/master/
版权声明:本文为博主原创文章,如需转载,请给出:
原文链接:https://blog.csdn.net/qq_35844043/article/details/129420874
相关文章:
VB6换个思路解决微信下载文件只读的问题(含源码)
日期:2023年3月10日 作者:Commas 签名:(ง •_•)ง 积跬步以致千里,积小流以成江海…… 注释:如果您觉得有所帮助,帮忙点个赞,也可以关注我,我们一起成长;如果有不对的地方…...
Allegro如何知道组合操作命令的拼写
Allegro如何知道组合操作命令的拼写 前面介绍了如何知道单个操作命令的拼写,但如果是复合命令,就无法直观的通过命令来了解,如下图 Snap Pick to -Segment这个命令拼写是什么 如何知道,具体操作如下 点击File点击Script 出现Scripting窗口...
CDO高效处理气象数据
基础命令,只需要在终端输入命令按enter运行即可 ####### 查看文件信息 cdo infos xxx.nc #显示nc文件中的变量名 cdo showname sst.nc #读文件夹下的数据 for i in $(ls);do echo processing $i ;done #线性插值 cdo remapbil,经度纬度 input.nc output.nc ;done ##…...
1. Qt Designer Studio界面介绍
1. 说明: Qt当中的Qt Quick框架使用QML语言来快速搭建优美的界面,但是对于单纯做界面的设计人员并不是很友好,还要让界面设计人员去消耗时间成本学习QML语法。Qt Designer Studio软件就是为了解决这个问题而设计的,工作人员不需要…...
elementUI+vue_vue-admin-template框架
目录安装版本管理文件mock文件夹---模拟数据permission.js --- 登录权限控制文件安装 克隆项目git clone https://gitee.com/panjiachen/vue-admin-template.git进入项目目录cd vue-element-admin安装依赖npm install启动服务npm run dev版本管理 由于我们之前的项目是直接从…...
SpringBoot项目使用Schedule注释创建定时任务
文章目录知识讲解相关注释(主要两个,EnableScheduling和Scheduled)scheduled的cron语法代码项目目录结构启动类(Application)定时任务类(Task)配置类(application.properties)pom依赖展望(Quart…...
学习 Python 之 Pygame 开发魂斗罗(十一)
学习 Python 之 Pygame 开发魂斗罗(十一)继续编写魂斗罗1. 改写主类函数中的代码顺序2. 修改玩家初始化3. 显示玩家生命值4. 设置玩家碰到敌人死亡5. 设置敌人子弹击中玩家6. 修改updatePlayerPosition()函数逻辑继续编写魂斗罗 在上次的博客学习 Pytho…...
Linux驱动开发
一、驱动分类Linux中包含三大类驱动:字符设备驱动、块设备驱动和网络设备驱动。其中字符设备驱动是最大的一类驱动,因为字符设备最多,从led到I2C、SPI、音频等都属于字符设备驱动。块设备驱动和网络设备驱动都要比字符设备驱动复杂。因为其比…...
32--Vue-前端开发-Vue语法之组件化开发
一、vue语法回顾 购物车的例子 eg1:计算商品价格(掌握对象的迭代方法) <!DOCTYPE html> <html lang="en"> <head>...
打怪升级之CFileDialog类介绍
CFileDialog类 CFileDialog封装用于文件打开操作或文件保存操作的常见对话框。信息来源自Windows官方文档:https://learn.microsoft.com/zh-cn/cpp/mfc/reference/cfiledialog-class?viewmsvc-170 这里重点介绍几个常用的函数功能: 构造函数 explic…...
配天智造自主原创数字工厂:百余名员工人均创收122万
配天智造(832223)2022年度报告显示,报告期内公司实现营业收入1.3亿元,同比增长52%,归属于挂牌公司股东的净利润3867万元,同比增长28.11%。而这家公司全部在职员工仅有107人,人均创收约为122万。…...
COLMAP
简介:在使用instant-ngp过程中需要使用COLMAP得到模型的必要输入,比如模型需要的相机外参我们就可以通过COLMAP中的sparse reconstruction稀疏重建得到;而对于depth map深度图我们则需要dense reconstruction稠密重建得到,下面我们…...
2023-3-8 刷题情况
礼盒的最大甜蜜度 题目描述 给你一个正整数数组 price ,其中 price[i] 表示第 i 类糖果的价格,另给你一个正整数 k 。 商店组合 k 类 不同 糖果打包成礼盒出售。礼盒的 甜蜜度 是礼盒中任意两种糖果 价格 绝对差的最小值。 返回礼盒的 最大 甜蜜度。…...
关于长连接服务器和客户端之间要加入心跳的一些讨论
在之前的章节里深入浅出TCPIP之深入浅出TCPIP之TCP重传机制 我们都知道了TCPIP协议栈有个默认的TCP心跳机制,这个心跳机制是和socket绑定的,可以对指定的套接字开启协议栈的心跳检测机制。默认情况下,协议栈的心跳机制对socket套接字是关闭的,如果要使用需要人为开启的。 比…...
LeetCode——1590. 使数组和能被 P 整除
一、题目 给你一个正整数数组 nums,请你移除 最短 子数组(可以为 空),使得剩余元素的 和 能被 p 整除。 不允许 将整个数组都移除。 请你返回你需要移除的最短子数组的长度,如果无法满足题目要求,返回 -1…...
12N65-ASEMI高压MOS管12N65
编辑-Z 12N65在TO-220封装里的静态漏极源导通电阻(RDS(ON))为0.68Ω,是一款N沟道高压MOS管。12N65的最大脉冲正向电流ISM为48A,零栅极电压漏极电流(IDSS)为10uA,其工作时耐温度范围为-55~150摄氏度。12N65功耗&#x…...
cushy-serial 一个轻量级Python serial库
本文自笔者博客: https://www.blog.zeeland.cn/archives/rgoihgxcoci3 简介 cushy-serial是一个轻量级的Serial框架,初衷是希望使Serial编程变得更加简单、快捷,因此,相较于传统的pyserial,该框架可以更加快速地构建起一个serial…...
音视频开发系列(7)——Opengl常用Api介绍part1
GLES20.glTexParameteri GLES20.glTexParameteri是OpenGL ES 2.0用于设置纹理过滤器和纹理包装模式的函数。它有三个参数: target参数 target参数指定要设置纹理参数的纹理目标,根据不同的target值,glTexParameteri函数的行为也会有所不同…...
linux时间的特殊用法
今天介绍linux下Date时间命令相关的特殊用法 date (当前的时间) 修改系统当前时间: date -s "2022-6-20 9:33:50" 昨天的时间是我们比较常用的: date -d "yesterday" %Y%m%d ( 昨天的时间) date -d "1 day ago" %Y%m%d …...
axios 封装,API接口统一管理
分享一个自己封装的 axios 网络请求 主要的功能及其优点: 将所有的接口放在一个文件夹中管理(api.js)。并且可以支持动态接口,就是 api.js 文件中定义的接口可以使用 :xx 占位,根据需要动态的改变。动态接口用法模仿…...
设计模式和设计原则回顾
设计模式和设计原则回顾 23种设计模式是设计原则的完美体现,设计原则设计原则是设计模式的理论基石, 设计模式 在经典的设计模式分类中(如《设计模式:可复用面向对象软件的基础》一书中),总共有23种设计模式,分为三大类: 一、创建型模式(5种) 1. 单例模式(Sing…...
8k长序列建模,蛋白质语言模型Prot42仅利用目标蛋白序列即可生成高亲和力结合剂
蛋白质结合剂(如抗体、抑制肽)在疾病诊断、成像分析及靶向药物递送等关键场景中发挥着不可替代的作用。传统上,高特异性蛋白质结合剂的开发高度依赖噬菌体展示、定向进化等实验技术,但这类方法普遍面临资源消耗巨大、研发周期冗长…...
DBAPI如何优雅的获取单条数据
API如何优雅的获取单条数据 案例一 对于查询类API,查询的是单条数据,比如根据主键ID查询用户信息,sql如下: select id, name, age from user where id #{id}API默认返回的数据格式是多条的,如下: {&qu…...
WordPress插件:AI多语言写作与智能配图、免费AI模型、SEO文章生成
厌倦手动写WordPress文章?AI自动生成,效率提升10倍! 支持多语言、自动配图、定时发布,让内容创作更轻松! AI内容生成 → 不想每天写文章?AI一键生成高质量内容!多语言支持 → 跨境电商必备&am…...
如何理解 IP 数据报中的 TTL?
目录 前言理解 前言 面试灵魂一问:说说对 IP 数据报中 TTL 的理解?我们都知道,IP 数据报由首部和数据两部分组成,首部又分为两部分:固定部分和可变部分,共占 20 字节,而即将讨论的 TTL 就位于首…...
Android 之 kotlin 语言学习笔记三(Kotlin-Java 互操作)
参考官方文档:https://developer.android.google.cn/kotlin/interop?hlzh-cn 一、Java(供 Kotlin 使用) 1、不得使用硬关键字 不要使用 Kotlin 的任何硬关键字作为方法的名称 或字段。允许使用 Kotlin 的软关键字、修饰符关键字和特殊标识…...
RNN避坑指南:从数学推导到LSTM/GRU工业级部署实战流程
本文较长,建议点赞收藏,以免遗失。更多AI大模型应用开发学习视频及资料,尽在聚客AI学院。 本文全面剖析RNN核心原理,深入讲解梯度消失/爆炸问题,并通过LSTM/GRU结构实现解决方案,提供时间序列预测和文本生成…...
【碎碎念】宝可梦 Mesh GO : 基于MESH网络的口袋妖怪 宝可梦GO游戏自组网系统
目录 游戏说明《宝可梦 Mesh GO》 —— 局域宝可梦探索Pokmon GO 类游戏核心理念应用场景Mesh 特性 宝可梦玩法融合设计游戏构想要素1. 地图探索(基于物理空间 广播范围)2. 野生宝可梦生成与广播3. 对战系统4. 道具与通信5. 延伸玩法 安全性设计 技术选…...
人工智能(大型语言模型 LLMs)对不同学科的影响以及由此产生的新学习方式
今天是关于AI如何在教学中增强学生的学习体验,我把重要信息标红了。人文学科的价值被低估了 ⬇️ 转型与必要性 人工智能正在深刻地改变教育,这并非炒作,而是已经发生的巨大变革。教育机构和教育者不能忽视它,试图简单地禁止学生使…...
【从零学习JVM|第三篇】类的生命周期(高频面试题)
前言: 在Java编程中,类的生命周期是指类从被加载到内存中开始,到被卸载出内存为止的整个过程。了解类的生命周期对于理解Java程序的运行机制以及性能优化非常重要。本文会深入探寻类的生命周期,让读者对此有深刻印象。 目录 …...
