Excel-VBA操作文件四大方法之四 联系客服

发布时间 : 星期一 文章Excel-VBA操作文件四大方法之四更新完毕开始阅读480b7648cf84b9d528ea7a12

Excel-VBA操作文件四大方法之四

四、利用API函数来处理文件

通过前面三种方法的介绍,你是否已经觉得足够了?是的,前面的方法完全可以应付几乎所有的文件操作。但是为了普及一下API,展示一下API的魅力,最后向大家介绍一下如何利用API函数来处理文件。另一方面也是本人对API情有独钟,为她做一下广告,呵呵。 大家对API的强大也是有所耳闻了,在文件操作方面,API自然毫不逊色。

说明:为了文章简洁,我们先给出API函数的名称及功能,其完整的声明及常数就不再一一细诉,只在示例中给出其完整用法。 (一)处理驱动器及目录

下面是windows中提供的对于目录进行操作的API函数及其功能: CreateDirectory,CreateDirectoryEx 创建一个新目录 GetCurrentDirectory 在一个缓冲区中装载当前目录

GetDiskFreeSpace,GetDiskFreeSpaceEx 获取与一个磁盘的组织有关的信息,以及了解剩余空间的容量 GetDriveType 判断一个磁盘驱动器的类型 GetFullPathName 获取指定文件的完整路径名 GetLogicalDrives 判断系统中存在哪些逻辑驱动器字母

GetLogicalDriveStrings 获取一个字串,其中包含了当前所有逻辑驱动器的根驱动器路径

GetSystemDirectory 这个函数能取得Windows系统目录(System目录)的完整路径名。在这个目录中,包含了所有必要的系统文件。根据微软的标准,其他定制控件和一 些共享组件也可放到这个目录。通常应避免在这个目录里创建文件。在网络环境中,往往需要管理员权限才可对这个目录进行写操作

GetTempPath 获取为临时文件指定的路径

GetVolumeInformation 获取与一个磁盘卷有关的信息

GetWindowsDirectory 这个函数能获取Windows目录的完整路径名。在这个目录里,保存了大多数windows应用程序文件及初始化文件 RemoveDirectory 删除指定目录 SetCurrentDirectory 设置当前目录

SetVolumeLabel 设置一个磁盘的卷标(Label)

下面通过几个例子来详细的了解一下其中主要的几个函数及其用法: 1、GetLogicalDrives

作用:判断系统中存在哪些逻辑驱动器字母

声明:Declare Function GetLogicalDrives Lib \ \

说明:此函数的返回值类型为Long,这个结构中的二进制位标志着存在哪些驱动器。其中,位0设为1表示驱动器A:存在于系统中;位1设为1表示存在B:驱动器;以次类推 示例:

Public Sub Get_LogicalDrives()

Dim LDs As Long, Cnt As Long, sDrives As String LDs = GetLogicalDrives sDrives = \:\For Cnt = 0 To 25

If (LDs And 2 ^ Cnt) <> 0 Then

sDrives = sDrives + \65 + Cnt) End If Next Cnt MsgBox sDrives End Sub

上面的示例中,我们通过二进制运算,将返回值转换成字符。如果你的机上有C,D,E,F,G,H这几个驱动器,那么LDs的值就是252,转成二进制为11111100,从右往左,依次代表A,B,C,D,...,为0的说明没有此驱动器字母。大家可以自己试一试。 2、GetDriveType

作用:判断一个磁盘驱动器的类型

声明:Declare Function GetDriveType Lib \Alias \ByVal nDrive As String) As Long

说明:此函数的返回值类型为Long,如驱动器不能识别,则返回零。如指定的目录不存在,则返回1。如执行成功,则用下述任何一个常数指 定驱动器类型:DRIVE_REMOVABLE(表示磁盘可以从驱动器上移走,通常是软驱), DRIVE_FIXED(磁盘不能从驱动器上移走,通常为本地硬盘), DRIVE_REMOTE(驱动器是远程网络驱动器), DRIVE_CDROM(驱动器是CD-ROM驱动器) 或 DRIVE_RAMDISK(驱动器是RAM驱动器)

参数为String类型,包含了驱动器根目录路径的一个字串 此函数的功能与FSO的Drive对象的DriveType属性是一样的。 示例: '定义常数变量

Private Const DRIVE_CDROM = 5 '表示光盘驱动器 Private Const DRIVE_FIXED = 3 '表示硬盘驱动器 Private Const DRIVE_RAMDISK = 6 '表示RAM驱动器 Private Const DRIVE_REMOTE = 4 '表示网络驱动器 Private Const DRIVE_REMOVABLE = 2 '表示软盘驱动器

Private Sub Get_DriveType() Dim temp As Long

temp = GetDriveType(\\取的d:盘驱动器类型 Select Case temp Case DRIVE_CDROM

MsgBox \CDROM: 光盘驱动器\Case DRIVE_FIXED

MsgBox \ED: 硬盘驱动器\Case DRIVE_RAMDISK

MsgBox \AMDISK: RAM驱动器\Case DRIVE_REMOTE

MsgBox \网络驱动器\

Case DRIVE_REMOVABLE

MsgBox \LE: 软盘驱动器\End Select End Sub

3、GetDiskFreeSpaceEx

作用:获取与一个磁盘的组织以及剩余空间容量有关的信息

声明:Declare Function GetDiskFreeSpaceEx Lib \ \ByVal lpRootPathName As String, lpFreeBytesAvailableToCaller As LARGE_INTEGER, lpTotalNumberOfBytes As LARGE_INTEGER, lpTotalNumberOfFreeBytes As LARGE_INTEGER) As Long

说明:此函数的返回值类型为Long,非零表示成功,零表示失败。会设置GetLastError.

在采用FAT16格式的windows95系统中,如一个驱动器(分区)的容量超过了2GB,则不应使用这个函数。此时,这个函数能识别的最大分区容量只有2GB 参数说明:

lpRootPathName String,不包括卷名的磁盘根路径名

lpFreeBytesAvailableToCaller LARGE_INTEGER,指定一个变量,用于容纳调用者可用的字节数量 lpTotalNumberOfBytes LARGE_INTEGER,指定一个变量,用于容纳磁盘上的总字节数 lpTotalNumberOfFreeBytes LARGE_INTEGER,指定一个变量,用于容纳磁盘上可用的字节数 LARGE_INTEGER结构用来代表一个64位带符号的整数值,它的定义如下: Type LARGE_INTEGER ' 8 Bytes lowpart As Long highpart As Long End Type

其中lowpart为 Long,指定低32位,highpart 为 Long,指定高32位。

示例:虽然此函数能识别的最大分区容量只有2GB,但通过调整,对大于2G的仍然能得出正确容量。以下的调整公式是本人通过逆向推算出来的,至于其中的原理也不是很清楚,大家可一测试一下。 Private Sub Get_DiskFreeSpaceEx() Dim temp As Long, Dms$ Dim tempa, tempb, tempc Dim RootPathName As String

Dim FreeBytesAvailabletoCaller As LARGE_INTEGER Dim TotalNumberOfBytes As LARGE_INTEGER Dim TotalNumberOfFreeBytes As LARGE_INTEGER RootPathName = \\'取得磁盘空间

temp = GetDiskFreeSpaceEx(RootPathName, FreeBytesAvailabletoCaller, TotalNumberOfBytes, TotalNumberOfFreeBytes)

Dms = Dms + \磁盘容量:\

tempa = TotalNumberOfBytes.highpart * 2 ^ 32 + IIf(TotalNumberOfBytes.lowpart > 0, TotalNumberOfBytes.lowpart, TotalNumberOfBytes.lowpart + 2 ^ 32) '计算容量 Dms = Dms + CStr(tempa) + \字节\

tempa = Format(tempa / 1024 / 1024 / 1024, \00\Dms = Dms + tempa + \'取得磁盘可用空间

Dms = Dms + \磁盘可用空间:\

tempb = TotalNumberOfFreeBytes.highpart * 2 ^ 32 + IIf(TotalNumberOfFreeBytes.lowpart > 0, TotalNumberOfFreeBytes.lowpart, TotalNumberOfFreeBytes.lowpart + 2 ^ 32) '计算 Dms = Dms + CStr(tempb) + \字节\

tempb = Format(tempb / 1024 / 1024 / 1024, \00\Dms = Dms + tempb + \'取得磁盘已用空间

Dms = Dms + \磁盘已用空间:\tempc = tempa - tempb

Dms = Dms + CStr(tempc) + \ MsgBox Dms End Sub

4、CreateDirectory, CreateDirectoryEx 作用:创建一个新目录 声明:

Declare Function CreateDirectory& Lib \ \ByVal lpNewDirectory As String, lpSecurityAttributes As SECURITY_ATTRIBUTES)

Declare Function CreateDirectoryEx& Lib \ByVal lpTemplateDirectory As String, ByVal lpNewDirectory As String, lpSecurityAttributes As SECURITY_ATTRIBUTES) 说明:此函数的返回值类型为Long,非零表示成功,零表示失败。会设置GetLastError 参数说明:

lpTemplateDirectory String,指定一个模板目录的名字,从中复制默认属性(比如目录中文件的默认压缩方式)。如设为vbNullString,则表示不使用模板

lpNewDirectory String,新目录的名字

lpSecurityAttributes SECURITY_ATTRIBUTES,这个结构定义了目录的安全特性——如果操作系统支持的话 示例:

Private Sub Create_Directory()

Dim Security As SECURITY_ATTRIBUTES '创建目录