Excel VBA 编程基础 -- 文件处理(三)今天我们仍然在下表的框架内讨论 VBA 中的文件处理:表1 VBA 早期的文件处理工具上文我们讨论了枚举文件 Dir 和 删除文件 Kill。今天我们来看如何获取 / 设置文件属性。GetAttrGetAttr 返回一个代表文件或目录属性的整数。其一般格式是:GetAttr(pathname)其中,pathname 是字符串表达式,指定要获取属性的目标(文件或目录)。pathname 可以包含驱动器和目录。GetAttr 的返回值列表如下:表2 GetAttr 返回值列表由于文件或目录可能具有一个或多个属性,因此 GetAttr 返回值有可能是上述常量值的组合,譬如,一个文件可能是只读,另一个文件可能是只读且隐含,等等。因此,需要对 GetAttr 的返回值进行 And 操作,以分离出目标的各个属性。例1. GetAttr 用法示例图1 GetAttr 用法示例从这个例子可以看出,驱动器 C 根目录下有一些文件和目录是系统且隐含的,其中有几个文件更是 GetAttr 所不能访问的。下图是 GetAdditionalAttrs 函数的代码:图2 GetAdditionalAttrs 函数代码从以上两图,可以看出如何解析 GetAttr 的返回值。SetAttrSetAttr 用来设置目标的属性。其一般格式是:SetAttr pathname, attributes其中,pathname 是字符串表达式,是要设置属性的目标(文件或目录)。attributes 是整数表达式,表示属性组合。attributes 的取值与表2 相同。例1. SetAttr 用法示例图3 SetAttr 用法示例由图可见,D:\VBA_file 目录原来具有 vbNormal 属性,经过 SetAttr 操作后,就具有了 vbReadOnly 属性。FileLenFileLen 返回文件长度。其一般格式是:FileLen(pathname)其中,pathname 是字符串表达式,指定要返回长度的文件名。FileLen 返回 Long 型整数,表示文件长度。例1. FileLen 用法示例图4 FileLen 用法示例这个例子,我们通过 FileLen 获知了驱动器 C 上的分页文件 pagefile.sys 的长度。因为 VBA 中没有无符号整数类型,因此对于比较大的数会显示为负数。对于最后折算为 MB 的计算中,我们使用了 Abs 函数取绝对值,得到分页文件的大小是 2048MB。这和电脑上显示的信息是一致的。FileDateTimeFileDateTime 返回目标被创建的时间或最近被修改的时间。其一般格式是:FileDateTime(pathname)其中,pathname 是字符串表达式,指定要获取时间的目标(文件或目录)。注:这里的“时间”表示广义时间,指日期(Date)和时间(Time)。例1. FileDateTime 用法示例图5 FileDateTime 用法示例在上面的代码中,如果将 dt 声明为 DateTime 类型,就会出错。声明为 Double 和 Variant 都可以,但 Double 类型需要经过 CDate 的类型转换才能显示日期时间。其实,VBA 的 DateTime 类型其内部表示就是 Double。FileDateTime 的返回值不能赋给 DateTime 类型的变量,但赋给 Double 类型的变量就可以。这真是匪夷所思!这算是 VBA 的怪癖之一吧。NameName 用来重命名文件或目录。其一般格式是:Name oldpathname As newpathname其中,oldpathname 是字符串表达式,指定要重命名的文件或目录。newpathname 是字符串表达式,指定文件或目录的新名字。注意:如果指定的新名字已存在,则会引发错误。oldpathname 和 newpathname 不能含有通配符(* 或 ?)。newpathname 所指定的新文件名可以和 oldpathname 所表示的旧文件名不在同一位置,即 Name 可以实现文件的移动功能。注:文件的重命名竟然可以实现文件的移动,这也可以算作 VBA 的怪癖行为了。Windows 有一个重命名命令 Rename:图6 Windows Rename 命令由图6 可见,Windows Rename 不允许为新名字指定新的位置,也就是说,Windows Rename 命令严格遵守了 Rename 的本义:只是更改文件名字。VBA 的 Name 语句有两点怪癖:Name 这个名字本身与其任务之一——重命名——不匹配,Rename 才能精确反映工作的目的。Name 在自身任务——重命名——之外,又叠加了 FileMove 的语义,这使得 Name 语句更加混乱。例1. Name 用法示例图7 Name 用法示例在这个例子中,我们首先把驱动器 D 上面的目录 VBA_file 改名为 VBA_files,然后把该目录下的文件 file1.txt 移动到驱动器 C 下面,重命名为 VBA_file_file1.txt。FileCopyFileCopy 用来拷贝文件。其一般格式是:FileCopy source, destination其中,source 是字符串表达式,指定要被拷贝的文件名。destination 是字符串表达式,指定文件的新位置和名字。例1. FileCopy 用法示例图7 FileCopy 用法示例通过这个例子,我们把上个例子中移动到驱动器 C 的文件又拷贝了回来。通过上篇和这篇文章,我们把 VBA 中早期对文件作为一个整体进行操作的工具差不多讨论完了。从下一篇开始我们深入到文件内部,讨论对文件内容的读写。相关阅读Excel VBA 编程基础 -- 文件处理(一)Excel VBA 编程基础 -- 文件处理(二)