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