GetAttr函数如何在这里工作?

时间:2017-06-23 14:28:30

标签: vba file

我从Stackoverflow获得了一些工作代码,说明是否找到了文件。 但是为什么这个" IsFile =((GetAttr(fName)和vbDirectory)<> vbDirectory)"工作? GetAttr返回一个数字16,如果它不是一个文件,但我不确定这里发生的不等式。

MsgBox (IsFile(fName))


End Sub
Function IsFile(ByVal fName As String) As Boolean
    On Error Resume Next
    IsFile = ((GetAttr(fName) And vbDirectory) <> vbDirectory)
End Function

1 个答案:

答案 0 :(得分:1)

我认为您的问题实际上是IsFile函数是如何工作的,而不仅仅是GetAttr函数是如何工作的,所以我将解释IsFile函数。

评估GetAttr(fName)时,如果文件不存在,则会导致错误。由于On Error Resume Next语句,您不会看到此错误并继续执行代码。尝试评论On Error Resume Next语句以自行验证。如果文件确实存在,那么GetAttr(fName)将计算为枚举类型,其类型为long。 vbDirectory也是一个值为16的枚举。

这一行:(GetAttr(fName) And vbDirectory)是一个强制进行逐位比较的逻辑比较。如果文件不存在,意味着GetAttr(fName)导致错误,则代码由于On Error Resume Next语句而继续执行。因此,比较变为vbDirectory不等于vbDirectory(即 - 是16&gt; 16),其评估为假。所以整个IsFile函数返回false(即IsFile(fName) = false),这意味着该文件不存在,这正是我们所期望的。

如果文件确实存在,则不会发生错误,并评估整行:
((GetAttr(fName) And vbDirectory) <> vbDirectory)

逻辑比较强制此部分计算为布尔值:(GetAttr(fName) And vbDirectory)并且由于对可用枚举进行按位比较,它将始终求值为false。假等于零。所以下一个比较就变成了这样:零不等于16?**这将总是评估为真,这使我们的语句(IsFile(fName))为真,这就是我们所期望的。

**为零不等于16
((GetAttr(fName) And vbDirectory) <> vbDirectory)
(0 <> vbDirectory)
(0 <> 16)
(0 <> 16) = true