我从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
答案 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