首页 热点资讯 义务教育 高等教育 出国留学 考研考公

急,请问如何 取消文件的 “只读” ?

发布网友 发布时间:2022-04-23 10:19

我来回答

1个回答

热心网友 时间:2023-10-07 23:52

但如何将只读文件修改为可读写的文件呢?当然是使用脚本了!

我们知道:您从未用过这种方法,对吧?

事实上,您可以使用以下脚本,它可以将文件 C:\Scripts\Test.vbs 从只读文件更改为可读写的文件:

Const ReadOnly = 1

Set objFSO = CreateObject("Scripting.FileSystemObject")
Set objFile = objFSO.GetFile("C:\Scripts\Test.vbs")

If objFile.Attributes AND ReadOnly Then
objFile.Attributes = objFile.Attributes XOR ReadOnly
End If

没错:或许我们应该解释一下这里发生了什么事。我们首先将常量 ReadOnly 的值设置为 1(一般情况下都设置为 1)。然后,我们创建一个 FileSystemObject 实例,并使用 GetFile 方法绑定到文件 C:\Scripts\Test.vbs。到目前为止,一切都很好。

但是从下面开始,问题变得奇怪起来,至少有点不寻常。只读属性是作为“位掩码”的一部分存储的,除了只读属性,“位掩码”还包括隐藏属性(值为 2 时表示文件为隐藏文件)和系统属性(值为 4 时表示文件为系统文件)。在位掩码(松散定义为以单个值存储的属性集合)中,可以将单个属性比作可打开或关闭的开关。因此,如果值为 1 的开关打开,则文件就是只读文件;如果值为 1 的开关关闭,那么文件就是可读写的文件。

那么就存在一个问题:如何判断这些开关是处于打开还是处于关闭状态呢?有关这点的完整说明超出了本文讨论的范围,但是有一个简单的判断方法就是使用位运算符 AND。注意脚本中有以下这么一行奇怪的代码:

If objFile.Attributes AND ReadOnly Then
信不信由你,这行代码的作用就是检查 ReadOnly 属性(值为 1)是否已经打开。那如果我们要检查文件是否为隐藏文件呢?好吧,在上述情况下(假设我们将常量 Hidden 的值设为 2),我们可以使用以下代码行:

If objFile.Attributes AND Hidden Then
一般说来,AND 操作符的含义类似于:“如果我们检查文件的属性,发现 ReadOnly 开关处于打开状态,那么这就是个只读文件,这个 If 语句就为真。如果 ReadOnly 开关处于关闭状态,那么这个 If 语句就为假。”有经验的脚本编写者可能会对这种解释不以为然,但这多少可以说明一点这里发生了什么。

那么我们为什么要检查文件是否为只读文件呢?好吧,这主要是因为我们将要使用 XOR 运算符来对这个开关执行“变换”;以下这行代码用于实现这个目的:

objFile.Attributes = objFile.Attributes XOR ReadOnly
在这个示例中,XOR 只是简单地切换文件状态。如果文件是只读文件,XOR 就将它切换为可读写的文件;如果文件是可读写的文件,XOR 就将它切换为只读文件。这就是为什么我们要先检查文件是否已经是只读文件的原因。因为如果文件是只读文件,那么我们就要变换开关,把它变成可读写的文件。如果文件已经是可读写的文件,那么我们显然不必变换开关;毕竟,那会把文件变成只读文件。(请记住,我们只是从一种状态切换到另一种状态。)

没错:这种位运算符容易让人混乱,所以我们还欠您一个解决办法。因此,以下脚本可以绑定到文件夹 C:\Scripts,并将该文件夹下的所有只读文件转为可读写的文件。这里我们暂不解释这个脚本如何获取文件夹中所有文件的列表,我们将在明天的专栏中专门探讨这个话题。(这种吸引别人的方法有点卑鄙吧,呵呵。)至于现在嘛,以下就是解决办法了:

Const ReadOnly = 1

Set objFSO = CreateObject("Scripting.FileSystemObject")
Set objFolder = objFSO.GetFolder("C:\Scripts")
Set colFiles = objFolder.Files

For Each objFile in colFiles
If objFile.Attributes AND ReadOnly Then
objFile.Attributes = objFile.Attributes XOR ReadOnly
End If
Next

我们明天见吧,嗯?

声明声明:本网页内容为用户发布,旨在传播知识,不代表本网认同其观点,若有侵权等问题请及时与本网联系,我们将在第一时间删除处理。E-MAIL:11247931@qq.com