[vba]-Excel-VBA操作文件四大方法之四(转)
四、利用API函数来处理文件 通过前面三种方法的介绍,你是否已经觉得足够了?是的,前面的方法完全可以应付几乎所有的文件操作。但是为了普及一下API,展示一下API的魅力,最后向大家介绍一下如何利用API函数来处理文件。另一方面也是本人对API情有独钟,为她做一下广告,呵呵。 大家对API的强大也是有所耳闻了,在文件操作方面,API自然毫不逊色。 (一)处理驱动器及目录 下面是windows中提供的对于目录进行操作的API函数及其功能: CreateDirectory,CreateDirectoryEx 创建一个新目录 下面通过几个例子来详细的了解一下其中主要的几个函数及其用法: 1、GetLogicalDrives 作用:判断系统中存在哪些逻辑驱动器字母 声明:Declare Function GetLogicalDrives Lib "kernel32" Alias "GetLogicalDrives" () As Long 说明:此函数的返回值类型为Long,这个结构中的二进制位标志着存在哪些驱动器。其中,位0设为1表示驱动器A:存在于系统中;位1设为1表示存在B:驱动器;以次类推 示例: 上面的示例中,我们通过二进制运算,将返回值转换成字符。如果你的机上有C,D,E,F,G,H这几个驱动器,那么LDs的值就是252,转成二进制为11111100,从右往左,依次代表A,B,C,D,...,为0的说明没有此驱动器字母。大家可以自己试一试。 2、GetDriveType 作用:判断一个磁盘驱动器的类型 声明:Declare Function GetDriveType Lib "kernel32" Alias "GetDriveTypeA" (ByVal nDrive As String) As Long 说明:此函数的返回值类型为Long,如驱动器不能识别,则返回零。如指定的目录不存在,则返回1。如执行成功,则用下述任何一个常数指定驱动器类型:DRIVE_REMOVABLE(表示磁盘可以从驱动器上移走,通常是软驱), DRIVE_FIXED(磁盘不能从驱动器上移走,通常为本地硬盘), DRIVE_REMOTE(驱动器是远程网络驱动器), DRIVE_CDROM(驱动器是CD-ROM驱动器) 或 DRIVE_RAMDISK(驱动器是RAM驱动器) 示例: Private Const DRIVE_CDROM = 5 \'表示光盘驱动器
3、GetDiskFreeSpaceEx 作用:获取与一个磁盘的组织以及剩余空间容量有关的信息 声明:Declare Function GetDiskFreeSpaceEx Lib "kernel32" Alias "GetDiskFreeSpaceExA" (ByVal lpRootPathName As String, lpFreeBytesAvailableToCaller As LARGE_INTEGER, lpTotalNumberOfBytes As LARGE_INTEGER, lpTotalNumberOfFreeBytes As LARGE_INTEGER) As Long 说明:此函数的返回值类型为Long,非零表示成功,零表示失败。会设置GetLastError. 在采用FAT16格式的windows95系统中,如一个驱动器(分区)的容量超过了2GB,则不应使用这个函数。此时,这个函数能识别的最大分区容量只有2GB 参数说明: LARGE_INTEGER结构用来代表一个64位带符号的整数值,它的定义如下: Type LARGE_INTEGER \' 8 Bytes 其中lowpart为 Long,指定低32位,highpart 为 Long,指定高32位。 示例:虽然此函数能识别的最大分区容量只有2GB,但通过调整,对大于2G的仍然能得出正确容量。以下的调整公式是本人通过逆向推算出来的,至于其中的原理也不是很清楚,大家可一测试一下。 Private Sub Get_DiskFreeSpaceEx() RootPathName = "d:" Dms = Dms + "磁盘容量:" + vbCrLf \'取得磁盘可用空间 Dms = Dms + "磁盘可用空间:" + vbCrLf \'取得磁盘已用空间 Dms = Dms + "磁盘已用空间:" + vbCrLf Dms = Dms + CStr(tempc) + "G" + vbCrLf MsgBox Dms 4、CreateDirectory, CreateDirectoryEx 作用:创建一个新目录 声明: Declare Function CreateDirectoryEx& Lib "kernel32" Alias "CreateDirectoryExA" (ByVal lpTemplateDirectory As String, ByVal lpNewDirectory As String, lpSecurityAttributes As SECURITY_ATTRIBUTES) 说明:此函数的返回值类型为Long,非零表示成功,零表示失败。会设置GetLastError 参数说明: 示例: 5、RemoveDirectory 作用:移除一个目录 声明:Declare Function RemoveDirectory Lib "kernel32" Alias "RemoveDirectoryA" (ByVal lpPathName As String) As Long 说明:此函数的返回值类型为Long,非零表示成功,零表示失败。会设置GetLastError. 参数说明: 示例: 6、SetCurrentDirectory 作用:设置当前目录,与VBA语句ChDir类似。 声明:Declare Function SetCurrentDirectory Lib "kernel32" Alias "SetCurrentDirectoryA" (ByVal lpPathName As String) As Long 说明:此函数的返回值类型为Long,非零表示成功,零表示失败。会设置GetLastError 参数说明: 示例: 7、GetSystemDirectory 作用:这个函数能取得Windows系统目录(System目录)的完整路径名。在这个目录中,包含了所有必要的系统文件。根据微软的标准,其他定制控件和一些共享组件也可放到这个目录。通常应避免在这个目录里创建文件。在网络环境中,往往需要管理员权限才可对这个目录进行写操作 声明:Declare Function GetSystemDirectory Lib "kernel32" Alias "GetSystemDirectoryA" (ByVal lpBuffer As String, ByVal nSize As Long) As Long 说明:此函数的返回值类型为Long,装载到lpBuffer缓冲区的字符数量。如lpBuffer不够大,不能容下文件名,则返回要求的缓冲区长度 参数说明: 示例:
[此贴子已经被作者于2007-4-2 19:10:01编辑过]
|
-- 作者:agstick -- 发布时间:2007-4-2 18:56:22 --
下面是windows中提供的对于文件进行操作的API函数及其功能: CloseHandle 关闭一个内核对象。其中包括文件、文件映射、进程、线程、安全和同步对象等。
LZOpenFile 打开压缩文件以读取
1、CreateFile 作用:这是一个全功能的例程,可打开和创建文件、管道、邮槽、通信服务、设备以及控制台 声明: 说明: 打开一个通信端口时(如COM1),无论如何都要设置成 OPEN_EXISTING。 这个函数代替了lOpen 和 lCreate函数,应该是我们的首选 参数说明: ·lpFileName String,要打开的文件的名字 ·dwFlagsAndAttributes 示例如下: lngHandle = CreateFile("c:\\text.txt", GENERIC_WRITE, FILE_SHARE_READ Or FILE_SHARE_WRITE, ByVal 0&, OPEN_ALWAYS, 0, 0) \'上面代码以写方法打开文件,如文件不存在则创建它。 2、lcreat 作用:创建一个文件。如文件已经存在,就会将其缩短成零长度,并将其打开,以便读写 声明:Declare Function lcreat Lib "kernel32" Alias "_lcreat" (ByVal lpPathName As String, ByVal iAttribute As Long) As Long 说明:此函数的返回值类型为Long,如执行成功,返回打开文件的句柄。如果出错,则返回HFILE_ERROR 该函数会打开已由其他应用程序打开的文件,所以使用它时要小心。win32的CreateFile函数已取代了这个函数。这个函数与vb的open语句作用相同 参数说明: lpPathName String,欲创建的文件的名字 0——文件能够读写 lcreat “c:\\test.txt”,0 3、lopen 作用:以二进制模式打开指定的文件 声明:Declare Function lopen Lib "kernel32" Alias "_lopen" (ByVal lpPathName As String, ByVal iReadWrite As Long) As Long 说明:此函数的返回值类型为Long,如执行成功,返回打开文件的句柄。HFILE_ERROR表示出错。会设置GetLastError 参数说明: lpPathName String,欲打开文件的名字 示例: 4、GetFileTime 作用:取得指定文件的时间信息 声明:Declare Function GetFileTime Lib "kernel32" Alias "GetFileTime" (ByVal hFile As Long, lpCreationTime As FILETIME, lpLastAccessTime As FILETIME, lpLastWriteTime As FILETIME) As Long 说明:Long,非零表示成功,零表示失败。会设置GetLastError 如果不需要特定的信息,那么lpCreationTime,lpLastAccessTime,lpLastWriteTime都可以设置为零(用ByVal As Long)。这个函数返回的文件时间采用UTC格式 参数说明: 示例: Dim file As Long str1 = "c:\\text.txt" 以上代码获取的时间信息是Long型的,还需要时间转换函数进行转换,完整的示例见附件。 5、CopyFile 作用:复制文件。与vb的filecopy命令相似 声明:Declare Function CopyFile Lib "kernel32" Alias "CopyFileA" (ByVal lpExistingFileName As String, ByVal lpNewFileName As String, ByVal bFailIfExists As Long) As Long 说明:Long,非零表示成功,零表示失败。会设置GetLastError 参数说明: lpExistingFileName String,源文件名
以上代码将c:\\test1.txt 拷贝到c:\\test2.txt,完整的示例见附件。 6、MoveFile, MoveFileEx 作用:移动文件。如dwFlags设为零,则MoveFile完全等价于MoveFileEx 声明: Declare Function MoveFileEx Lib "kernel32" Alias "MoveFileExA" (ByVal lpExistingFileName As String, ByVal lpNewFileName As String, ByVal dwFlags As Long) 说明:Long,非零表示成功,零表示失败。会设置GetLastError 这两个函数通常不能将文件从一个卷移动到另一个卷。但如设置了MOVEFILE_COPY_ALLOWED标记,MoveFileEx可以做到这一点. 参数说明: lpExistingFileName String,欲移动的文件名 示例: MoveFile "c:\\test.txt", "d:\\test1.txt" ‘移动文件 以上代码实现了文件的移动,两次移动後,文件不变 7、DeleteFile 作用:删除指定文件 声明:Declare Function DeleteFile Lib "kernel32" Alias "DeleteFileA" (ByVal lpFileName As String) As Long 说明:Long,非零表示成功,零表示失败。会设置GetLastError 与vba的kill语句相似,在windows 95下使用这个函数要小心——即使文件当前正由一个应用程序打开,该函数也会将其删除. 参数说明: 示例: DeleteFile "c:\\test.txt" \'删除c:\\test.txt文件 完整的示例见附件。 8、ReadFile 作用:从文件中读出数据。与lread函数相比,这个函数要明显灵活的多。该函数能够操作通信设备、管道、套接字以及邮槽 声明:Private Declare Function ReadFile Lib "kernel32" Alias "ReadFile" (ByVal hFile As Long, lpBuffer As Any, ByVal nNumberOfBytesToRead As Long, lpNumberOfBytesRead As Long, lpOverlapped As OVERLAPPED) As Long 说明:Long,非零表示成功,零表示失败。会设置GetLastError。如启动的是一次异步读操作,则函数会返回零值,并将ERROR_IO_PENDING设置成GetLastError的结果。如结果不是零值,但读入的字节数小于nNumberOfBytesToRead参数指定的值,表明早已抵达了文件的结尾 参数: 示例:完整的示例见附件。 9、WriteFile 作用:将数据写入一个文件。该函数比lwrite函数要灵活的多。也可将这个函数应用于对通信设备、管道、套接字以及邮槽的处理 声明:Declare Function WriteFile Lib "kernel32" Alias "WriteFile" (ByVal hFile As Long, lpBuffer As Any, ByVal nNumberOfBytesToWrite As Long, lpNumberOfBytesWritten As Long, lpOverlapped As OVERLAPPED) As Long 说明:Long,TRUE(非零)表示成功,否则返回零。会设置GetLastError 参数: lpNumberOfBytesWritten - Long,实际写入文件的字节数量 lpOverlapped --- OVERLAPPED,倘若在指定FILE_FLAG_OVERLAPPED的前提下打开文件,这个参数就必须引用一个特殊的结构。那个结构定义了一次异步写操作。否则,该参数应置为空(将声明变为ByVal As Long,并传递零值) 示例:完整的示例见附件。
作用:此函数的功能很强大,能对文件或文件夹进行复制、移动、重命名、删除的全部操作。 声明:Declare Function SHFileOperation Lib "shell32.dll" Alias "SHFileOperationA" (lpFileOp As SHFILEOPSTRUCT) As Long 说明:Long,TRUE(非零)表示成功,否则返回零。 参数: 示例:见附件。
通过以上的介绍,我们可以看到API在文件操作方面功能十分强大,能够完成一些前面方法所不能完成的任务。FileSystemObject对象模型的内部可能就是用API写的,即便不是我们也可以用API写出一个FSO类来。API是一个巨大的宝库,当你为实现某个功能而愁眉不展的时候,查查API可能就能找到满意的答案。 写的这么多,希望对大家有所帮助,至少操作文件是没有什么问题了。 |