ExcelVBA操作文件四大方法之四利用API函数来处理文件.docx

上传人:b****9 文档编号:25805498 上传时间:2023-06-15 格式:DOCX 页数:18 大小:27.58KB
下载 相关 举报
ExcelVBA操作文件四大方法之四利用API函数来处理文件.docx_第1页
第1页 / 共18页
ExcelVBA操作文件四大方法之四利用API函数来处理文件.docx_第2页
第2页 / 共18页
ExcelVBA操作文件四大方法之四利用API函数来处理文件.docx_第3页
第3页 / 共18页
ExcelVBA操作文件四大方法之四利用API函数来处理文件.docx_第4页
第4页 / 共18页
ExcelVBA操作文件四大方法之四利用API函数来处理文件.docx_第5页
第5页 / 共18页
点击查看更多>>
下载资源
资源描述

ExcelVBA操作文件四大方法之四利用API函数来处理文件.docx

《ExcelVBA操作文件四大方法之四利用API函数来处理文件.docx》由会员分享,可在线阅读,更多相关《ExcelVBA操作文件四大方法之四利用API函数来处理文件.docx(18页珍藏版)》请在冰豆网上搜索。

ExcelVBA操作文件四大方法之四利用API函数来处理文件.docx

ExcelVBA操作文件四大方法之四利用API函数来处理文件

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

作用:

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

声明:

DeclareFunctionGetLogicalDrivesLib"kernel32"Alias"GetLogicalDrives"()AsLong

说明:

此函数的返回值类型为Long,这个结构中的二进制位标志着存在哪些驱动器。

其中,位0设为1表示驱动器A:

存在于系统中;位1设为1表示存在B:

驱动器;以次类推

示例:

PublicSubGet_LogicalDrives()

DimLDsAsLong,CntAsLong,sDrivesAsString

   LDs=GetLogicalDrives

   sDrives="Availabledrives:

"

   ForCnt=0To25

       If(LDsAnd2^Cnt)<>0Then

           sDrives=sDrives+" "+Chr$(65+Cnt)

       EndIf

   NextCnt

MsgBoxsDrives

EndSub

上面的示例中,我们通过二进制运算,将返回值转换成字符。

如果你的机上有C,D,E,F,G,H这几个驱动器,那么LDs的值就是252,转成二进制为11111100,从右往左,依次代表A,B,C,D,...,为0的说明没有此驱动器字母。

大家可以自己试一试。

2、GetDriveType

作用:

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

声明:

DeclareFunctionGetDriveTypeLib"kernel32"Alias"GetDriveTypeA"(ByValnDriveAsString)AsLong

说明:

此函数的返回值类型为Long,如驱动器不能识别,则返回零。

如指定的目录不存在,则返回1。

如执行成功,则用下述任何一个常数指定驱动器类型:

DRIVE_REMOVABLE(表示磁盘可以从驱动器上移走,通常是软驱),DRIVE_FIXED(磁盘不能从驱动器上移走,通常为本地硬盘),DRIVE_REMOTE(驱动器是远程网络驱动器),DRIVE_CDROM(驱动器是CD-ROM驱动器)或DRIVE_RAMDISK(驱动器是RAM驱动器)

参数为String类型,包含了驱动器根目录路径的一个字串

此函数的功能与FSO的Drive对象的DriveType属性是一样的。

示例:

\'定义常数变量

PrivateConstDRIVE_CDROM=5      \'表示光盘驱动器

PrivateConstDRIVE_FIXED=3      \'表示硬盘驱动器

PrivateConstDRIVE_RAMDISK=6    \'表示RAM驱动器

PrivateConstDRIVE_REMOTE=4     \'表示网络驱动器

PrivateConstDRIVE_REMOVABLE=2  \'表示软盘驱动器

PrivateSubGet_DriveType()

 DimtempAsLong

 temp=GetDriveType("d:

\\")   \'取的d:

盘驱动器类型

 SelectCasetemp

   CaseDRIVE_CDROM

     MsgBox"DRIVE_CDROM:

光盘驱动器"

   CaseDRIVE_FIXED

     MsgBox"DRIVE_FIXED:

硬盘驱动器"

   CaseDRIVE_RAMDISK

     MsgBox"DRIVE_RAMDISK:

RAM驱动器"

   CaseDRIVE_REMOTE

     MsgBox"DRIVE_REMOTE:

网络驱动器"

   CaseDRIVE_REMOVABLE

     MsgBox"DRIVE_REMOVABLE:

软盘驱动器"

 EndSelect

EndSub

3、GetDiskFreeSpaceEx

作用:

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

声明:

DeclareFunctionGetDiskFreeSpaceExLib"kernel32"Alias"GetDiskFreeSpaceExA"(ByVallpRootPathNameAsString,lpFreeBytesAvailableToCallerAsLARGE_INTEGER,lpTotalNumberOfBytesAsLARGE_INTEGER,lpTotalNumberOfFreeBytesAsLARGE_INTEGER)AsLong

说明:

此函数的返回值类型为Long,非零表示成功,零表示失败。

会设置GetLastError.

在采用FAT16格式的windows95系统中,如一个驱动器(分区)的容量超过了2GB,则不应使用这个函数。

此时,这个函数能识别的最大分区容量只有2GB

参数说明:

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

lpFreeBytesAvailableToCallerLARGE_INTEGER,指定一个变量,用于容纳调用者可用的字节数量

lpTotalNumberOfBytesLARGE_INTEGER,指定一个变量,用于容纳磁盘上的总字节数

lpTotalNumberOfFreeBytesLARGE_INTEGER,指定一个变量,用于容纳磁盘上可用的字节数

LARGE_INTEGER结构用来代表一个64位带符号的整数值,它的定义如下:

TypeLARGE_INTEGER\'8Bytes

 lowpartAsLong

 highpartAsLong

EndType

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

示例:

虽然此函数能识别的最大分区容量只有2GB,但通过调整,对大于2G的仍然能得出正确容量。

以下的调整公式是本人通过逆向推算出来的,至于其中的原理也不是很清楚,大家可一测试一下。

PrivateSubGet_DiskFreeSpaceEx()

 DimtempAsLong,Dms$

 Dimtempa,tempb,tempc

 DimRootPathNameAsString

 DimFreeBytesAvailabletoCallerAsLARGE_INTEGER

 DimTotalNumberOfBytesAsLARGE_INTEGER

 DimTotalNumberOfFreeBytesAsLARGE_INTEGER

 RootPathName="d:

"

\'取得磁盘空间

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

 Dms=Dms+"磁盘容量:

"+vbCrLf

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

 Dms=Dms+CStr(tempa)+"字节"+vbCrLf

 tempa=Format(tempa/1024/1024/1024,"0.00")

 Dms=Dms+tempa+"G"+vbCrLf

\'取得磁盘可用空间

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

"+vbCrLf

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

 Dms=Dms+CStr(tempb)+"字节"+vbCrLf

 tempb=Format(tempb/1024/1024/1024,"0.00")

 Dms=Dms+tempb+"G"+vbCrLf

\'取得磁盘已用空间

 Dms=Dms+"磁盘已用空间:

"+vbCrLf

 tempc=tempa-tempb

 Dms=Dms+CStr(tempc)+"G"+vbCrLf

 MsgBoxDms

EndSub

4、CreateDirectory,CreateDirectoryEx

作用:

创建一个新目录

声明:

DeclareFunctionCreateDirectory&Lib"kernel32"Alias"CreateDirectoryA"(ByVallpNewDirectoryAsString,lpSecurityAttributesAsSECURITY_ATTRIBUTES)

DeclareFunctionCreateDirectoryEx&Lib"kernel32"Alias"CreateDirectoryExA"(ByVallpTemplateDirectoryAsString,ByVallpNewDirectoryAsString,lpSecurityAttributesAsSECURITY_ATTRIBUTES)

说明:

此函数的返回值类型为Long,非零表示成功,零表示失败。

会设置GetLastError

参数说明:

lpTemplateDirectoryString,指定一个模板目录的名字,从中复制默认属性(比如目录中文件的默认压缩方式)。

如设为vbNullString,则表示不使用模板

lpNewDirectoryString,新目录的名字

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

示例:

PrivateSubCreate_Directory()

   DimSecurityAsSECURITY_ATTRIBUTES

   \'创建目录

   Ret&=CreateDirectory("C:

\\Directory",Security)

   \'若返回0,则失败。

   IfRet&=0ThenMsgBox"Error:

创建失败!

",vbCritical+vbOKOnly

EndSub

5、RemoveDirectory

作用:

移除一个目录

声明:

DeclareFunctionRemoveDirectoryLib"kernel32"Alias"RemoveDirectoryA"(ByVallpPathNameAsString)AsLong

说明:

此函数的返回值类型为Long,非零表示成功,零表示失败。

会设置GetLastError.

在调用这个函数前,目录必须为空

参数说明:

lpPathName为String类型,要删除的那个目录的名字

示例:

PrivateSubRemove_Directory()

   DimSecurityAsSECURITY_ATTRIBUTES

   CreateDirectoryEx"C:

\\Windows","C:

\\Temp",Security

   \'移除目录

   RemoveDirectory"C:

\\Temp"

EndSub

6、SetCurrentDirectory

作用:

设置当前目录,与VBA语句ChDir类似。

声明:

DeclareFunctionSetCurrentDirectoryLib"kernel32"Alias"SetCurrentDirectoryA"(ByVallpPathNameAsString)AsLong

说明:

此函数的返回值类型为Long,非零表示成功,零表示失败。

会设置GetLastError

参数说明:

LpPathNameString,新当前目录的路径

示例:

SetCurrentDirectory"d:

\\" \'设置D:

为当前目录

7、GetSystemDirectory

作用:

这个函数能取得Windows系统目录(System目录)的完整路径名。

在这个目录中,包含了所有必要的系统文件。

根据微软的标准,其他定制控件和一些共享组件也可放到这个目录。

通常应避免在这个目录里创建文件。

在网络环境中,往往需要管理员权限才可对这个目录进行写操作

声明:

DeclareFunctionGetSystemDirectoryLib"kernel32"Alias"GetSystemDirectoryA"(ByVallpBufferAsString,ByValnSizeAsLong)AsLong

说明:

此函数的返回值类型为Long,装载到lpBuffer缓冲区的字符数量。

如lpBuffer不够大,不能容下文件名,则返回要求的缓冲区长度

参数说明:

lpBufferString,用于装载系统目录路径名的一个字串缓冲区。

它应事先初始化成nSize+1个字符的长度。

通常至少要为这个缓冲区分配MAX_PATH个字符的长度

nSizeLong,lpBuffer字串的最大长度

示例:

PrivateSubGet_SystemDirectory()

   DimsSaveAsString,RetAsLong

   \'创建缓冲区

   sSave=Space(255)

   \'获取系统目录

   Ret=GetSystemDirectory(sSave,255)

   \'移除多余的0

   sSave=Left$(sSave,Ret)

   \'显示路径

   MsgBox"系统目录:

"+sSave

EndSub

 

[此贴子已经被作者于2007-4-219:

10:

01编辑过]

--  作者:

agstick

--  发布时间:

2007-4-218:

56:

22

--  

(二)处理文件

下面是windows中提供的对于文件进行操作的API函数及其功能:

CloseHandle  关闭一个内核对象。

其中包括文件、文件映射、进程、线程、安全和同步对象等。

CompareFileTime 根据FILETIME结构的信息,对比两个文件的时间

CopyFile  复制文件。

注意:

只能复制文件,而不能复制目录

CreateFile  这是一个全功能的函数,可打开和创建文件、管道、邮槽、通信服务、设备以及控制台

DeleteFile  删除指定文件

FindClose  关闭由FindFirstFile函数创建的一个搜索句柄

FindFirstFile  根据文件名查找文件

FindNextFile  根据调用FindFirstFile函数时指定的一个文件名查找下一个文件

FlushFileBuffers 针对指定的文件句柄,刷新内部文件缓冲区

GetBinaryType  判断文件是否可以执行

GetFileAttributes 判断指定文件的属性

GetFileInformationByHandle该函数能够获取上面所有函数所能够获取的信息,如大小、属性等,同时还包括一些其他地方无法获取的信息,比如:

文件卷标、索引和链接信息。

GetFileSize  判断文件长度

GetFileTime  取得指定文件的时间信息,有三个文件时间:

创建时间、最后访问时间、最后写时间。

GetFileType  在给出文件句柄的前提下,判断文件类型

GetFileVersionInfo 从支持版本标记的一个模块里获取文件版本信息

GetFileVersionInfoSize 针对包含了版本资源的一个文件,判断容纳文件版本信息需要一个多大的缓冲区

GetFullPathName 获取文件路径,该函数获取文件的完整路径名。

注意:

只有当该文件在当前目录下,

   结果才正确。

如果要得到真正的路径。

应该用GetModuleFileName函数。

GetShortPathName 获取指定文件的短路径名

GetTempFileName 这个函数包含了一个临时文件的名字,它可由应用程序使用

GetTempPath  获取Windows临时目录路径

lclose   关闭指定的文件,请参考CloseHandle函数,了解进一步的情况

lcreat   创建一个文件。

如文件已经存在,就会将其缩短成零长度,并将其打开,以便读写

llseek   设置文件中进行读写的当前位置。

该函数与vba的seek语句类似。

LockFile  在windows中,文件可用共享模式打开——在这种情况下,多个进程可同时访问该文件。

   利用这个函数,要对文件进行读写的一个应用程序可将文件的某一部分锁定起来,使其

   不能由其他应用程序访问。

这样便避免了同时读写时发生的冲突

LockFileEx  与LockFile相似,只是它提供了更多的功能

lopen   以二进制模式打开指定的文件

lread   将文件中的数据读入内存缓冲区

lwrite   将数据从内存缓冲区写入一个文件

MoveFile,MoveFileEx 移动文件。

如dwFlags设为零,则MoveFile完全等价于MoveFileEx

OpenFile  这个函数能执行大量不同的文件操作。

和这个函数相比,请优先考虑CreateFile函数

   (它能打开命名管道和控制Unicode文件名,同时不受128个字符的路径名称的限制)

ReadFile  从文件中读出数据。

与lread函数相比,这个函数要明显灵活的多。

该函数能够操作

   通信设备、管道、套接字以及邮槽

ReadFileEx  与ReadFile相似,只是它只能用于异步读操作,并包含了一个完整的回调

SearchPath  查找指定文件

SetEndOfFile  针对一个打开的文件,将当前文件位置设为文件末尾

SetFileAttributes 设置文件属性

SetFilePointer  在一个文件中设置当前的读写位置

SetFileTime  设置文件的创建、访问及上次修改时间

UnlockFile  解除对一个文件的锁定

UnlockFileEx  解除对一个文件的锁定

WriteFile  将数据写入一个文件。

该函数比lwrite函数要灵活的多。

也可将这个函数应用于对

   通信设备、管道、套接字以及邮槽的处理

WriteFileEx  与WriteFile类似,只是它只能用于异步写操作,并包括了一个完整的回调

文件的压缩和解压缩

LZOpenFile  打开压缩文件以读取

LZSeek   查找压缩文件中的一个位置

LZRead   读一个压缩文件

LZClose  关闭一个压缩文件

LZCopy   复制压缩文件并在处理过程中展开

GetExpandedName 从压缩文件中返回文件名称。

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

1、CreateFile

作用:

这是一个全功能的例程,可打开和创建文件、管道、邮槽、通信服务、设备以及控制台

声明:

DeclareFunctionCreateFileLib"kernel32"Alias"CreateFileA"(ByVallpFileNameAsString,ByValdwDesiredAccessAsLong,ByValdwShareModeAsLong,lpSecurityAttributesAsSECURITY_ATTRIBUTES,ByValdwCreationDispositionAsLong,ByValdwFlagsAndAttributesA

展开阅读全文
相关资源
猜你喜欢
相关搜索
资源标签

当前位置:首页 > 总结汇报 > 学习总结

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1