当前位置: 首页 > news >正文

VB6换个思路解决微信下载文件只读的问题(含源码)

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


在这里插入图片描述


文章目录

  • 一、前言
  • 二、设置与取消文件只读权限
  • 三、判断文件只读
  • 四、实现过程


一、前言

当一个文件(WordExcelPPT等等)编辑的差不多了,准备保存的时候,哟,好家伙,发现该文件权限设置为只读(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 参数设置可为:

常数描述
vbNormal0常规(缺省值),可读可写
vbReadOnly1只读
vbHidden2隐藏
vbSystem4系统文件
vbArchive32上次备份以后,文件已经改变

设置只读示例:

'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 返回的值,是下面这些属性值的总和:

常数值(十进制)值(二进制)描述
vbNormal00常规
vbReadOnly11只读
vbHidden210隐藏
vbSystem4100系统文件
vbDirectory1610000目录或文件夹
vbArchive3210000上次备份以后,文件已经改变
vbalias641000000指定的文件名是别名

特别说明

若要判断是否设置了某个属性,在 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换个思路解决微信下载文件只读的问题(含源码)

日期&#xff1a;2023年3月10日 作者&#xff1a;Commas 签名&#xff1a;(ง •_•)ง 积跬步以致千里,积小流以成江海…… 注释&#xff1a;如果您觉得有所帮助&#xff0c;帮忙点个赞&#xff0c;也可以关注我&#xff0c;我们一起成长&#xff1b;如果有不对的地方&#xf…...

Allegro如何知道组合操作命令的拼写

Allegro如何知道组合操作命令的拼写 前面介绍了如何知道单个操作命令的拼写,但如果是复合命令,就无法直观的通过命令来了解,如下图 Snap Pick to -Segment这个命令拼写是什么 如何知道,具体操作如下 点击File点击Script 出现Scripting窗口...

CDO高效处理气象数据

基础命令&#xff0c;只需要在终端输入命令按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. 说明&#xff1a; Qt当中的Qt Quick框架使用QML语言来快速搭建优美的界面&#xff0c;但是对于单纯做界面的设计人员并不是很友好&#xff0c;还要让界面设计人员去消耗时间成本学习QML语法。Qt Designer Studio软件就是为了解决这个问题而设计的&#xff0c;工作人员不需要…...

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注释创建定时任务

文章目录知识讲解相关注释&#xff08;主要两个,EnableScheduling和Scheduled&#xff09;scheduled的cron语法代码项目目录结构启动类&#xff08;Application&#xff09;定时任务类(Task)配置类&#xff08;application.properties&#xff09;pom依赖展望&#xff08;Quart…...

学习 Python 之 Pygame 开发魂斗罗(十一)

学习 Python 之 Pygame 开发魂斗罗&#xff08;十一&#xff09;继续编写魂斗罗1. 改写主类函数中的代码顺序2. 修改玩家初始化3. 显示玩家生命值4. 设置玩家碰到敌人死亡5. 设置敌人子弹击中玩家6. 修改updatePlayerPosition()函数逻辑继续编写魂斗罗 在上次的博客学习 Pytho…...

Linux驱动开发

一、驱动分类Linux中包含三大类驱动&#xff1a;字符设备驱动、块设备驱动和网络设备驱动。其中字符设备驱动是最大的一类驱动&#xff0c;因为字符设备最多&#xff0c;从led到I2C、SPI、音频等都属于字符设备驱动。块设备驱动和网络设备驱动都要比字符设备驱动复杂。因为其比…...

32--Vue-前端开发-Vue语法之组件化开发

一、vue语法回顾 购物车的例子 eg1:计算商品价格(掌握对象的迭代方法) <!DOCTYPE html> <html lang="en"> <head>...

打怪升级之CFileDialog类介绍

CFileDialog类 CFileDialog封装用于文件打开操作或文件保存操作的常见对话框。信息来源自Windows官方文档&#xff1a;https://learn.microsoft.com/zh-cn/cpp/mfc/reference/cfiledialog-class?viewmsvc-170 这里重点介绍几个常用的函数功能&#xff1a; 构造函数 explic…...

配天智造自主原创数字工厂:百余名员工人均创收122万

配天智造&#xff08;832223&#xff09;2022年度报告显示&#xff0c;报告期内公司实现营业收入1.3亿元&#xff0c;同比增长52%&#xff0c;归属于挂牌公司股东的净利润3867万元&#xff0c;同比增长28.11%。而这家公司全部在职员工仅有107人&#xff0c;人均创收约为122万。…...

COLMAP

简介&#xff1a;在使用instant-ngp过程中需要使用COLMAP得到模型的必要输入&#xff0c;比如模型需要的相机外参我们就可以通过COLMAP中的sparse reconstruction稀疏重建得到&#xff1b;而对于depth map深度图我们则需要dense reconstruction稠密重建得到&#xff0c;下面我们…...

2023-3-8 刷题情况

礼盒的最大甜蜜度 题目描述 给你一个正整数数组 price &#xff0c;其中 price[i] 表示第 i 类糖果的价格&#xff0c;另给你一个正整数 k 。 商店组合 k 类 不同 糖果打包成礼盒出售。礼盒的 甜蜜度 是礼盒中任意两种糖果 价格 绝对差的最小值。 返回礼盒的 最大 甜蜜度。…...

关于长连接服务器和客户端之间要加入心跳的一些讨论

在之前的章节里深入浅出TCPIP之深入浅出TCPIP之TCP重传机制 我们都知道了TCPIP协议栈有个默认的TCP心跳机制,这个心跳机制是和socket绑定的,可以对指定的套接字开启协议栈的心跳检测机制。默认情况下,协议栈的心跳机制对socket套接字是关闭的,如果要使用需要人为开启的。 比…...

LeetCode——1590. 使数组和能被 P 整除

一、题目 给你一个正整数数组 nums&#xff0c;请你移除 最短 子数组&#xff08;可以为 空&#xff09;&#xff0c;使得剩余元素的 和 能被 p 整除。 不允许 将整个数组都移除。 请你返回你需要移除的最短子数组的长度&#xff0c;如果无法满足题目要求&#xff0c;返回 -1…...

12N65-ASEMI高压MOS管12N65

编辑-Z 12N65在TO-220封装里的静态漏极源导通电阻&#xff08;RDS(ON)&#xff09;为0.68Ω&#xff0c;是一款N沟道高压MOS管。12N65的最大脉冲正向电流ISM为48A&#xff0c;零栅极电压漏极电流(IDSS)为10uA&#xff0c;其工作时耐温度范围为-55~150摄氏度。12N65功耗&#x…...

cushy-serial 一个轻量级Python serial库

本文自笔者博客: https://www.blog.zeeland.cn/archives/rgoihgxcoci3 简介 cushy-serial是一个轻量级的Serial框架&#xff0c;初衷是希望使Serial编程变得更加简单、快捷&#xff0c;因此&#xff0c;相较于传统的pyserial&#xff0c;该框架可以更加快速地构建起一个serial…...

音视频开发系列(7)——Opengl常用Api介绍part1

GLES20.glTexParameteri GLES20.glTexParameteri是OpenGL ES 2.0用于设置纹理过滤器和纹理包装模式的函数。它有三个参数&#xff1a; target参数 target参数指定要设置纹理参数的纹理目标&#xff0c;根据不同的target值&#xff0c;glTexParameteri函数的行为也会有所不同…...

linux时间的特殊用法

今天介绍linux下Date时间命令相关的特殊用法 date (当前的时间) 修改系统当前时间&#xff1a; date -s "2022-6-20 9:33:50" 昨天的时间是我们比较常用的&#xff1a; date -d "yesterday" %Y%m%d ( 昨天的时间) date -d "1 day ago" %Y%m%d …...

axios 封装,API接口统一管理

分享一个自己封装的 axios 网络请求 主要的功能及其优点&#xff1a; 将所有的接口放在一个文件夹中管理&#xff08;api.js&#xff09;。并且可以支持动态接口&#xff0c;就是 api.js 文件中定义的接口可以使用 :xx 占位&#xff0c;根据需要动态的改变。动态接口用法模仿…...

conda相比python好处

Conda 作为 Python 的环境和包管理工具&#xff0c;相比原生 Python 生态&#xff08;如 pip 虚拟环境&#xff09;有许多独特优势&#xff0c;尤其在多项目管理、依赖处理和跨平台兼容性等方面表现更优。以下是 Conda 的核心好处&#xff1a; 一、一站式环境管理&#xff1a…...

【WiFi帧结构】

文章目录 帧结构MAC头部管理帧 帧结构 Wi-Fi的帧分为三部分组成&#xff1a;MAC头部frame bodyFCS&#xff0c;其中MAC是固定格式的&#xff0c;frame body是可变长度。 MAC头部有frame control&#xff0c;duration&#xff0c;address1&#xff0c;address2&#xff0c;addre…...

PHP和Node.js哪个更爽?

先说结论&#xff0c;rust完胜。 php&#xff1a;laravel&#xff0c;swoole&#xff0c;webman&#xff0c;最开始在苏宁的时候写了几年php&#xff0c;当时觉得php真的是世界上最好的语言&#xff0c;因为当初活在舒适圈里&#xff0c;不愿意跳出来&#xff0c;就好比当初活在…...

java调用dll出现unsatisfiedLinkError以及JNA和JNI的区别

UnsatisfiedLinkError 在对接硬件设备中&#xff0c;我们会遇到使用 java 调用 dll文件 的情况&#xff0c;此时大概率出现UnsatisfiedLinkError链接错误&#xff0c;原因可能有如下几种 类名错误包名错误方法名参数错误使用 JNI 协议调用&#xff0c;结果 dll 未实现 JNI 协…...

蓝桥杯 2024 15届国赛 A组 儿童节快乐

P10576 [蓝桥杯 2024 国 A] 儿童节快乐 题目描述 五彩斑斓的气球在蓝天下悠然飘荡&#xff0c;轻快的音乐在耳边持续回荡&#xff0c;小朋友们手牵着手一同畅快欢笑。在这样一片安乐祥和的氛围下&#xff0c;六一来了。 今天是六一儿童节&#xff0c;小蓝老师为了让大家在节…...

TRS收益互换:跨境资本流动的金融创新工具与系统化解决方案

一、TRS收益互换的本质与业务逻辑 &#xff08;一&#xff09;概念解析 TRS&#xff08;Total Return Swap&#xff09;收益互换是一种金融衍生工具&#xff0c;指交易双方约定在未来一定期限内&#xff0c;基于特定资产或指数的表现进行现金流交换的协议。其核心特征包括&am…...

C++.OpenGL (10/64)基础光照(Basic Lighting)

基础光照(Basic Lighting) 冯氏光照模型(Phong Lighting Model) #mermaid-svg-GLdskXwWINxNGHso {font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}#mermaid-svg-GLdskXwWINxNGHso .error-icon{fill:#552222;}#mermaid-svg-GLd…...

select、poll、epoll 与 Reactor 模式

在高并发网络编程领域&#xff0c;高效处理大量连接和 I/O 事件是系统性能的关键。select、poll、epoll 作为 I/O 多路复用技术的代表&#xff0c;以及基于它们实现的 Reactor 模式&#xff0c;为开发者提供了强大的工具。本文将深入探讨这些技术的底层原理、优缺点。​ 一、I…...

Python Ovito统计金刚石结构数量

大家好,我是小马老师。 本文介绍python ovito方法统计金刚石结构的方法。 Ovito Identify diamond structure命令可以识别和统计金刚石结构,但是无法直接输出结构的变化情况。 本文使用python调用ovito包的方法,可以持续统计各步的金刚石结构,具体代码如下: from ovito…...

【Linux】Linux 系统默认的目录及作用说明

博主介绍&#xff1a;✌全网粉丝23W&#xff0c;CSDN博客专家、Java领域优质创作者&#xff0c;掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java技术领域✌ 技术范围&#xff1a;SpringBoot、SpringCloud、Vue、SSM、HTML、Nodejs、Python、MySQL、PostgreSQL、大数据、物…...