新动态:shfileoperation返回值(解除shfileoperation异常处理 利用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 “kernel32” Alias “GetLogicalDrives” () As Long
说明:此函数的返回值类型为Long,这个结构中的二进制位标志着存在哪些驱动器。其中,位0设为1表示驱动器A:存在于系统中;位1设为1表示存在B:驱动器;以次类推
示例:
Public Sub Get_LogicalDrives()
Dim LDs As Long, Cnt As Long, sDrives As String
LDs = GetLogicalDrives
sDrives = “Available drives:”
For Cnt = 0 To 25
If (LDs And 2 ^ Cnt) <> 0 Then
sDrives = sDrives + ” ” + Chr$(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 “kernel32” Alias “GetDriveTypeA” (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:\”) ‘取的d:盘驱动器类型
Select Case temp
Case DRIVE_CDROM
MsgBox “DRIVE_CDROM: 光盘驱动器”
Case DRIVE_FIXED
MsgBox “DRIVE_FIXED: 硬盘驱动器”
Case DRIVE_RAMDISK
MsgBox “DRIVE_RAMDISK: RAM驱动器”
Case DRIVE_REMOTE
MsgBox “DRIVE_REMOTE: 网络驱动器”
Case DRIVE_REMOVABLE
MsgBox “DRIVE_REMOVABLE: 软盘驱动器”
End Select
End Sub
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
参数说明:
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 = “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
MsgBox Dms
End Sub
4、CreateDirectory, CreateDirectoryEx
作用:创建一个新目录
声明:
Declare Function CreateDirectory& Lib “kernel32” Alias “CreateDirectoryA” (ByVal lpNewDirectory As String, lpSecurityAttributes As SECURITY_ATTRIBUTES)
Declare Function CreateDirectoryEx& Lib “kernel32” Alias “CreateDirectoryExA” (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
‘创建目录
Ret& = CreateDirectory(“C:\Directory”, Security)
‘若返回0,则失败。
If Ret& = 0 Then MsgBox “Error : 创建失败!”, vbCritical + vbOKOnly
End Sub
5、RemoveDirectory
作用:移除一个目录
声明:Declare Function RemoveDirectory Lib “kernel32” Alias “RemoveDirectoryA” (ByVal lpPathName As String) As Long
说明:此函数的返回值类型为Long,非零表示成功,零表示失败。会设置GetLastError.
在调用这个函数前,目录必须为空
参数说明:
lpPathName 为String类型,要删除的那个目录的名字
示例:
Private Sub Remove_Directory()
Dim Security As SECURITY_ATTRIBUTES
CreateDirectoryEx “C:\Windows”, “C:\Temp”, Security
‘移除目录
RemoveDirectory “C:\Temp”
End Sub
6、SetCurrentDirectory
作用:设置当前目录,与VBA语句ChDir类似。
声明:Declare Function SetCurrentDirectory Lib “kernel32” Alias “SetCurrentDirectoryA” (ByVal lpPathName As String) As Long
说明:此函数的返回值类型为Long,非零表示成功,零表示失败。会设置GetLastError
参数说明:
LpPathName String,新当前目录的路径
示例:
SetCurrentDirectory “d:\” ‘设置D:为当前目录
7、GetSystemDirectory
作用:这个函数能取得Windows系统目录(System目录)的完整路径名。在这个目录中,包含了所有必要的系统文件。根据微软的标准,其他定制控件和一些共享组件也可放到这个目录。通常应避免在这个目录里创建文件。在网络环境中,往往需要管理员权限才可对这个目录进行写操作
声明:Declare Function GetSystemDirectory Lib “kernel32” Alias “GetSystemDirectoryA” (ByVal lpBuffer As String, ByVal nSize As Long) As Long
说明:此函数的返回值类型为Long,装载到lpBuffer缓冲区的字符数量。如lpBuffer不够大,不能容下文件名,则返回要求的缓冲区长度
参数说明:
lpBuffer String,用于装载系统目录路径名的一个字串缓冲区。它应事先初始化成nSize+1个字符的长度。通常至少要为这个缓冲区分配MAX_PATH个字符的长度
nSize Long,lpBuffer字串的最大长度
示例:
Private Sub Get_SystemDirectory()
Dim sSave As String, Ret As Long
‘创建缓冲区
sSave = Space(255)
‘获取系统目录
Ret = GetSystemDirectory(sSave, 255)
‘移除多余的0
sSave = Left$(sSave, Ret)
‘显示路径
MsgBox “系统目录: ” + sSave
End Sub
(二)处理文件
下面是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
作用:这是一个全功能的例程,可打开和创建文件、管道、邮槽、通信服务、设备以及控制台
声明:
Declare Function CreateFile Lib “kernel32” Alias “CreateFileA” (ByVal lpFileName As String, ByVal dwDesiredAccess As Long, ByVal dwShareMode As Long, lpSecurityAttributes As SECURITY_ATTRIBUTES, ByVal dwCreationDisposition As Long, ByVal dwFlagsAndAttributes As Long, ByVal hTemplateFile As Long) As Long
说明:
此函数的返回值类型为Long,如执行成功,则返回文件句柄。INVALID_HANDLE_VALUE表示出错,会设置GetLastError。即使函数成功,但若文件存在,且指定了CREATE_ALWAYS 或 OPEN_ALWAYS,GetLastError也会设为ERROR_ALREADY_EXISTS
打开一个通信端口时(如COM1),无论如何都要设置成 OPEN_EXISTING。
这个函数代替了lOpen 和 lCreate函数,应该是我们的首选
参数说明:
•lpFileName String,要打开的文件的名字
•dwDesiredAccess Long,如果为 GENERIC_READ 表示允许对设备进行读访问;如果为 GENERIC_WRITE 表示允许对设备进行写访问(可组合使用);如果为零,表示只允许获取与一个设备有关的信息
•dwShareMode Long,零表示不共享; FILE_SHARE_READ 和/或 FILE_SHARE_WRITE 表示允许对文件进行共享访问
•lpSecurityAttributes SECURITY_ATTRIBUTES,指向一个SECURITY_ATTRIBUTES结构的指针,定义了文件的安全特性(如果操作系统支持的话)
•dwCreationDisposition
Long,下述常数之一:
CREATE_NEW 创建文件;如文件存在则会出错
CREATE_ALWAYS 创建文件,会改写前一个文件
OPEN_EXISTING 文件必须已经存在。由设备提出要求
OPEN_ALWAYS 如文件不存在则创建它
TRUNCATE_EXISTING 讲现有文件缩短为零长度
•dwFlagsAndAttributes
Long,一个或多个下述常数
FILE_ATTRIBUTE_ARCHIVE 标记归档属性
FILE_ATTRIBUTE_COMPRESSED 将文件标记为已压缩,或者标记为文件在目录中的默认压缩方式
FILE_ATTRIBUTE_NORMAL 默认属性
FILE_ATTRIBUTE_HIDDEN 隐藏文件或目录
FILE_ATTRIBUTE_READONLY 文件为只读
FILE_ATTRIBUTE_SYSTEM 文件为系统文件
FILE_FLAG_WRITE_THROUGH 操作系统不得推迟对文件的写操作
FILE_FLAG_OVERLAPPED 允许对文件进行重叠操作
FILE_FLAG_NO_BUFFERING 禁止对文件进行缓冲处理。文件只能写入磁盘卷的扇区块
FILE_FLAG_RANDOM_ACCESS 针对随机访问对文件缓冲进行优化
FILE_FLAG_SEQUENTIAL_SCAN 针对连续访问对文件缓冲进行优化
FILE_FLAG_DELETE_ON_CLOSE 关闭了上一次打开的句柄后,将文件删除。特别适合临时文件
也可在Windows NT下组合使用下述常数标记:
SECURITY_ANONYMOUS, SECURITY_IDENTIFICATION, SECURITY_IMPERSONATION, SECURITY_DELEGATION, SECURITY_CONTEXT_TRACKING, SECURITY_EFFECTIVE_ONLY
•hTemplateFile Long,如果不为零,则指定一个文件句柄。新文件将从这个文件中复制扩展属性
示例如下:
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,欲创建的文件的名字
iAttribute Long,下述值之一:
0——文件能够读写
1——创建只读文件
2——创建隐藏文件
3——创建系统文件
示例:
下面的语句打开c:\test.txt文件
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,欲打开文件的名字
iReadWrite Long,访问模式和共享模式常数的一个组合,如下所示:
1、访问模式
READ 打开文件,读取其中的内容
READ_WRITE 打开文件,对其进行读写
WRITE 打开文件,在其中写入内容
2、共享模式(参考OpenFile函数的标志常数表)
OF_SHARE_COMPAT, OF_SHARE_DENY_NONE, OF_SHARE_DENY_READ, OF_SHARE_DENY_WRITE, OF_SHARE_EXCLUSIVE
示例:
lopen “c:\test.txt”,READ
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格式
参数说明:
hFile Long,文件的句柄
lpCreationTime FILETIME,用于装载文件的创建时间
lpLastAccessTime FILETIME,用于装载文件上一次访问的时间(FAT文件系统不支持这一特性)
lpLastWriteTime FILETIME,用于装载文件上一次修改的时间
示例:
Dim file As Long
Dim CreationTime As FileTime
Dim lastaccesstime As FileTime
Dim lastaccesstime As FileTime
‘定义结构
Private Type FileTime
dwLowDateTime As Long
dwHighDateTime As Long
End Type
str1 = “c:\text.txt”
file = lopen(str1, READ_WRITE) ‘打开文件
temp = GetFileTime(file, CreationTime, lastaccesstime, lastwritetime)’得到文件相关信息
以上代码获取的时间信息是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,源文件名
lpNewFileName String,目标文件名
bFailIfExists Long,如果设为TRUE(非零),那么一旦目标文件已经存在,则函数调用会失败。否则目标文件被改写
示例:
CopyFile “c:\test1.txt”, “c:\test2.txt”, 1
以上代码将c:\test1.txt 拷贝到c:\test2.txt,完整的示例见附件。
6、MoveFile, MoveFileEx
作用:移动文件。如dwFlags设为零,则MoveFile完全等价于MoveFileEx
声明:
Declare Function MoveFile Lib “kernel32” Alias “MoveFileA” (ByVal lpExistingFileName As String, ByVal lpNewFileName As String)
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,欲移动的文件名
lpNewFileName String,新文件名
dwFlags Long,一个或多个下述常数
MOVEFILE_REPLACE_EXISTING 如目标文件存在,则将其替换
MOVEFILE_COPY_ALLOWED 如移动到一个不同的卷,则复制文件并删除原来的文件
MOVEFILE_DELAY_UNTIL_REBOOT 移动操作在系统下次重新启动时正式进行。这样便可在Windows NT中改换系统文件
示例:
Private Const MOVEFILE_COPY_ALLOWED = &H2
Private Const MOVEFILE_DELAY_UNTIL_REBOOT = &H4
Private Const MOVEFILE_REPLACE_EXISTING = &H1
MoveFile “c:\test.txt”, “d:\test1.txt” ‘移动文件
MoveFileEx “d:\test1.txt”, “c:\test.txt”, MOVEFILE_COPY_ALLOWED ‘再一次移动
以上代码实现了文件的移动,两次移动後,文件不变
7、DeleteFile
作用:删除指定文件
声明:Declare Function DeleteFile Lib “kernel32” Alias “DeleteFileA” (ByVal lpFileName As String) As Long
说明:Long,非零表示成功,零表示失败。会设置GetLastError
与vba的kill语句相似,在windows 95下使用这个函数要小心——即使文件当前正由一个应用程序打开,该函数也会将其删除.
参数说明:
lpFileName String,欲删除文件的名字
示例:
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参数指定的值,表明早已抵达了文件的结尾
参数:
hFile —- Long,文件的句柄
lpBuffer — Any,用于保存读入数据的一个缓冲区
nNumberOfBytesToRead – Long,要读入的字符数
lpNumberOfBytesRead – Long,从文件中实际读入的字符数
lpOverlapped — OVERLAPPED,如文件打开时指定了FILE_FLAG_OVERLAPPED,那么必须用这个参数引用一个特殊的结构。那个结构定义了一次异步读取操作。否则,应将这个参数设为NULL(将函数声明成ByVal As Long,并传递零值)
示例:完整的示例见附件。
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
参数:
hFile — Long,一个文件的句柄
lpBuffer — Any,要写入的一个数据缓冲区
nNumberOfBytesToWrite – Long,要写入数据的字节数量。如写入零字节,表示什么都不写入,但会更新文件的“上一次修改时间”。针对位于远程系统的命名管道,限制在65535个字节以内
lpNumberOfBytesWritten – Long,实际写入文件的字节数量
lpOverlapped — OVERLAPPED,倘若在指定FILE_FLAG_OVERLAPPED的前提下打开文件,这个参数就必须引用一个特殊的结构。那个结构定义了一次异步写操作。否则,该参数应置为空(将声明变为ByVal As Long,并传递零值)
示例:完整的示例见附件。
10、SHFileOperation
作用:此函数的功能很强大,能对文件或文件夹进行复制、移动、重命名、删除的全部操作。
声明:Declare Function SHFileOperation Lib “shell32.dll” Alias “SHFileOperationA” (lpFileOp As SHFILEOPSTRUCT) As Long
说明:Long,TRUE(非零)表示成功,否则返回零。
参数:
lpFileOp --SHFILEOPSTRUCT类型,指定文件的操作。
Type SHFILEOPSTRUCT
hwnd As Long
wFunc As Long ‘对文件的操作指令
pFrom As String ‘源文件或路径
pTo As String ‘目的文件或路径
fFlags As Integer ‘操作标志
fAnyOperationsAborted As Long
hNameMappings As Long
lpszProgressTitle As String
End Type
示例:见附件。
(三)总结
通过以上的介绍,我们可以看到API在文件操作方面功能十分强大,能够完成一些前面方法所不能完成的任务。FileSystemObject对象模型的内部可能就是用API写的,即便不是我们也可以用API写出一个FSO类来。API是一个巨大的宝库,当你为实现某个功能而愁眉不展的时候,查查API可能就能找到满意的答案。
标签:
相关阅读
-
新动态:shfileoperation返回值(解除shfileoperation异常处理 利用API函数来处理文件)
四、利用API函数来处理文件通过前面三种方法的介绍,你是否已经觉得足够了?是的,前面的方法完全可以应...
2023-02-02 -
新动态:shfileoperation返回值(解除shfileoperation异常处理 利用API函数来处理文件)
四、利用API函数来处理文件通过前面三种方法的介绍,你是否已经觉得足够了?是的,前面的方法完全可以应...
2023-02-02 -
苏州:支持刚性和改善性购房需求 2023年将新增青年人才公寓2万套
苏州:支持刚性和改善性购房需求2023年将新增青年人才公寓2万套,措施,刚性,商品房,改善性,购房者,苏州市...
2023-02-02 -
天天头条:《生化危机4:重制版》新情报:没QTE 阿什莉没血条了
《生化危机4:重制版》新情报:没QTE阿什莉没血条了介绍了 近日外媒gameinformer公布了《生化危机4:...
2023-02-02 -
索尼宣布即将于5月关闭PS+ Collection
索尼宣布即将于5月关闭PS+Collection介绍了 索尼日前宣布将于5月9日关闭PlayStationPlusCollection。...
2023-02-02 -
《原子之心》概述预告发布 欢迎来到奇妙的乌托邦世界|前沿热点
《原子之心》概述预告发布欢迎来到奇妙的乌托邦世界介绍了 发行商FocusEntertainment和开发商Mundfis...
2023-02-02 -
Switch《霍格沃茨之遗》经过优化游戏素质有保障 最新快讯
由AvalancheSoftware开发的《霍格沃茨之遗》将与2月发售,这款游戏也存在Switch版本,只不过需要等到7月才能上市
2023-02-02 -
侠盗猎车手5(GTA5)PC版作弊码秘籍 三种方式可以实现
侠盗猎车手5(GTA5)PC版作弊码秘籍;1 在游戏中按“~”键(小键盘1左边的那个键),输入秘籍后按回车。2 拿...
2023-02-02 -
503 service temporarily unavailable是什么意思 随小编来看看吧
在网页时出现503servicetemporarilyunavailable是什么意思?这让很多网友在访问某个网站时摸不着头脑,...
2023-02-02 -
每日热文:iPhone12电池容量多少毫安 iPhone12电池容量详情
iPhone12电池容量多少毫安?随着10月14日的发布会结束,iPhone12终于发布了,一共有四款机型,而且还是...
2023-02-02 -
当前关注:iPhone12屏幕尺寸多大 iPhone12屏幕尺寸参数介绍
iPhone12屏幕尺寸多大?对于还未发布的iPhone12系列,小伙伴们的好奇心越来越重了,尤其是随着爆料的越...
2023-02-02 -
iPhonex尺寸是多少 iPhoneX尺寸介绍_世界快播报
今年下半年,苹果公司发布了苹果手机十周年纪念款——iPhoneX,不少网友都被iPhonex的外观设计给惊艳到...
2023-02-02 -
503 service temporarily unavailable是什么意思_环球报资讯
在网页时出现503servicetemporarilyunavailable是什么意思?这让很多网友在访问某个网站时摸不着头脑,...
2023-02-02 -
【世界说】美媒:一个分裂的国家如何抗击流行病?美国疫情高度政治化 公众信任危机愈演愈烈 播资讯
现代快报网是由凤凰出版传媒集团旗下的现代快报倾力打造的江苏新闻门户网站,目前在南京、苏州、无锡、常...
2023-02-02 -
iPhone12屏幕尺寸多大 iPhone12系列介绍 全球热门
iPhone12屏幕尺寸多大?对于还未发布的iPhone12系列,小伙伴们的好奇心越来越重了,尤其是随着爆料的越...
2023-02-02 -
一般的电脑屏幕分辨率为多少? 以下是详细介绍|环球热推荐
目前主要的显示器拥有16:9比例的23与22(21 5)英寸宽屏液晶显示器的最佳分辨率是:1920×1080分辨率;...
2023-02-02 -
启动operating system not found怎么办解决方法 一起来看看吧
当电脑出现OperatingSystemNotFound信息,我们一般都会怀疑是硬盘引导信息丢失了,重装就可以解决。不过...
2023-02-02
精彩推荐
阅读排行
相关词
- hd3000能玩什么游戏 有什么优点
- ipad充不进去电是怎么回事 三种方法教你解决
- 全球观天下!如何卸载ie浏览器?如何卸载IE浏览器的方法介绍
- c盘清理工具 史上最简单清理最干净工具大全_速讯
- 湖北阳新民俗文化闹元宵
- 侠盗猎车手5(GTA5)PC版作弊码秘籍 三种方式可以实现
- NVIDIA GeForce gt750m显卡怎么样
- 教大家tmp文件怎么打开 一文带你清楚了解_全球头条
- 文章骂驴是什么电影 《走着瞧》剧情简介-今日讯
- 电脑启动慢是什么原因 要如何优化呢-焦点短讯
- 全球热点评!电脑蓝牙怎么开_电脑蓝牙打开方法 不懂的进来学习
- 点亮元宵节夜空的花灯匠人 热头条
- 网页视频下载_如何下载网页视频_小编为你带来参考_报道
- 什么是ie浏览器
- 世界百事通!胡某宇事件迎来最新进展:认定胡某宇系自缢死亡
- 显卡驱动安装失败怎么办 要怎么解决_世界观天下
- 网页视频下载_如何下载网页视频_网页视频怎么下载
- 如何显示文件后缀名 具体操作步骤如下
- 环球简讯:1394连接是什么 1394网络适配器知识
- 手机相片打印机哪款好 手机相片打印机推荐(LG PD233)|全球速看料
- 海南:一些地产中介兜售房源可能有诈
- 今日热门!网卡有什么用 网卡功能与作用 网卡的价格
- 国际奥委会:北京冬奥会创造了持续的社会效益和经济效益 环球热闻
- 当前热门:游戏笔记本哪个好? 五千元笔记本推荐
- 外媒报道:中国旅游业正强势复苏
- 前沿热点:电脑屏幕模糊怎么办 下文为大家分享解决方法
- 樊振东朱雨玲的关系 樊振东结婚了吗 |全球播报
- 听!百鸟鸣啭,在海南这一方净土_环球今热点
- 洪小铃结婚了吗,洪小铃是什么星座
- 黑白电视机品牌 黑白电视机品牌介绍
- 弹簧笔逃生好玩吗 弹簧笔逃生玩法简介 世界百事通
- 亲爱的自己无膜电池成功了吗,王子茹李思雨是什么电视剧
- 微信转账24小时到账在哪设置?微信延迟到账有什么用?
- 环球热推荐:克拉恋人大结局是什么 一共多少集
- 元侃是谁,赵恒介绍 相关资料介绍 快看
- 科幻竞技场官网在哪下载 最新官方下载安装地址 每日关注
- 环球即时看!姜子牙时长多少分钟,姜子牙剧情简介
- 八佰为什么被禁 八佰被撤档的原因公开 最新快讯
- iphone12运行内存是多少 iphone12运行内存配置
- 那年花开月正圆沈星移结局好不好-世界热闻
- 大侠霍元甲共多少集,大侠霍元甲剧情介绍 今日观点
- qq飞车怎么开永久雷诺 qq飞车怎么开永久雷诺方法介绍|环球时快讯
- 没有什么能够阻挡是哪首歌的歌词 原唱是谁? 全球讯息
- Android4.0是什么 十大特性有哪些?
- 你是魔鬼中的天使是什么歌谁唱的 这首歌发布于哪一年_天天视点
- 天天观焦点:gg是什么意思 出自哪里,如何引用
- 陆远为什么在美国坐牢,《好先生》相关剧情介绍
- 全球看热讯:加查动漫世界官网在哪下载 最新官方下载安装地址
- 韦一航是什么剧中的,送你一朵小红花剧情介绍 世界看热讯
- 一开始我以为你是我的唯一是什么歌,不再打扰是谁唱的 天天观热点
- 当前观点:以家人之名原著小说叫什么 最后结局怎么样
- 兑换破损人民币遭拒绝怎么办?哪些情况残币不能兑换?
- 每日热闻!白凤九和东华帝君结局 《三生三世枕上书》多少集?
- 王校长名字由来,王校长指的谁?_天天关注
- 星厨奇迹什么时候出 公测上线时间预告
- 原神天真博物馆打法攻略 原神天真博物馆怎么过
- 支付宝投诉举报有用吗?支付宝举报成立多久出结果?
- 非法勾兑贩卖“咳嗽水”,海南一女子被刑拘!
- 微信支付提示银行卡状态异常怎么办?微信银行卡怎么查余额?
- 【天天播资讯】索尼宣布即将于5月关闭PS+ Collection
- 《怪物猎人崛起:曙光》发布第四弹更新预告 追加「冰呪龙」等内容
- 全面注册制落地,券商股高开,红塔证券大涨超9%
- 《消逝的光芒2》更新后支持DLSS3 游戏帧数暴涨|环球时快讯
- 【环球速看料】曝未公布的单机版《泰坦陨落》游戏被EA砍掉
- 索尼宣布即将于5月关闭PS+ Collection|全球信息
- 《采石场惊魂》D加密已被移除 78%好评率
- 全球球精选!《红霞岛》需全程联网 单人游戏仍要联网
- 通讯!“离谱”AI绘画赚钱不离谱
- EA 2023财年Q3财报:收入和利润双增长|今日热搜
- 《生化危机4:重制版》没有QTE 阿什莉没血条了
- 《守望先锋2》第三赛季2月7日上线 双倍经验活动开启 环球头条
- 这顿年夜饭,他们从胃“暖”到心-微动态
- 新年画绘出新生活
- 当前讯息:《失忆症:地堡》推迟至5月16日发行
- 信用卡丢失后怎么还款?信用卡补办需要还清吗?
- 山东聊城:番茄品种研发开辟新赛道 找回“老味道”_天天观热点
- 信用卡挂失不补卡算不算销户?信用卡遗失了能注销吗?
- 老粗布迎来新生机 精选
- 信用卡逾期可以把卡销户吗?信用卡注销影响信用吗?
- 什么都没有怎么申请信用卡?光大信用卡容易通过吗?
- 共建共享:李河村变了样
- 价格升幅前五的是这些,昨日武汉白沙洲农副产品价格行情 快消息
- 河南新乡:“老乐宝”助力“银发族”融入数字生活
- 杰富瑞: 维持现代牙科买入评级,目标价11港元
- 信用卡多长时间开卡有效?信用卡多久能激活?
- 英雄挂外域官网在哪下载 最新官方下载安装地址
- 劳动力市场加速回暖 “用工旺”释放经济回升鲜明信号
- 激斗绝地反击官网在哪下载 最新官方下载安装地址-世界热讯
- 需要面签的贷款可靠吗?贷款面签后多久能放贷?
- 成本支撑+预期好转 多家钛白粉龙头公司调涨产品价格
- 全国千万级机场首位! 天天即时看
- 弹个球吧什么时候出 公测上线时间预告|天天动态
- C919产业链简述:从一个机型到一个产业,C919开启中国航空新时代-天天热消息
- 火柴人搭桥救援什么时候出 公测上线时间预告 世界热议
- 琼中启动“百家驿站送春风”返岗复工行动
- 贷款还款的方式有哪几种?贷款哪种还款更划算?
- 逃离之谜冒险什么时候出 公测上线时间预告
- 雨过天青云破处 千年汝瓷焕新颜
- 三部门出台税收优惠政策 支持跨境电商发展
- LPR下调已经贷款的怎么办?LPR还能改回来吗?
- 世界观热点:聚焦营商环境优化 政策礼包激发市场主体活力
- 国产大型水陆两栖飞机AG600M全面进入型号取证试飞阶段
- 全球消息!2022年我国软件业务收入跃上10万亿元台阶
- 失信人多久能恢复信用?有过失信记录能贷款吗?
- 北京751园区:工业遗址 时尚气息
- 浙江杭州“文艺星火赋美”工程:街头巷尾 艺韵流淌 全球看热讯
- 场内基金和股票的玩法一样吗?基金是股票的一种吗?
- 九棵树(上海)未来艺术中心:森林剧院 沉浸体验_热头条
- 近600年的古壁画“活”了|快报
- 新手如何挑选基金?新手买基金投多少钱合适?
- 《大桥》升起之时,理想与热血犹在
- 股票踏空和套牢哪个更难受?炒股踏空了怎么办?
- 世界争霸战争好玩吗 世界争霸战争玩法简介 今日热讯
- 【环球速看料】野生白虎家庭模拟什么时候出 公测上线时间预告
- 捏脸男孩什么时候出 公测上线时间预告
- 今日讯!中信建投梳理生成式AI相关布局的上市公司
- 理财无固定期限有风险吗?无固定期限的理财能不能买?
- 豪宅大战僵尸好玩吗 豪宅大战僵尸玩法简介|每日速读
- 坚持战斗功夫大师官网在哪下载 最新官方下载安装地址
- 基金买入净值按实时还是收盘?基金收盘后买入怎么算?
- 可转债买了就能转股吗?股票开户当天能买可转债吗?
- 新股申购怎么获得资格?新股没人申购怎么办?
- 理财产品怎么买比较合适?理财产品买多久最好?
- 天天热推荐:云南河泊所遗址清理出汉代有字简牍1300多枚、封泥837枚
- 冷冷冷!冷空气又来了!降温10℃!9级阵风!这些地方注意-天天日报
- “全民级影视”爆款力作让我们看到了什么?
- 文化和旅游部公布新一批国家级文化生态保护区名单
- 全球观点:文化和旅游部、国家文物局:加强文物市场行政执法工作
- 香港故宫文化博物馆将呈献首个博物馆馆藏特别展览
- 当前速读:村长养猪场官网在哪下载 最新官方下载安装地址
- 恐龙驯兽师什么时候出 公测上线时间预告
- 当前最新:激斗绝地反击什么时候出 公测上线时间预告
- 世界热点!我的指甲贼长好玩吗 我的指甲贼长玩法简介
- 购物狂人好玩吗 购物狂人玩法简介
- 新佳园东里有元宵节活动
- 枕戈待旦巡守加勒万
- 视讯!多地公布2023民生清单 养老服务、婴幼儿托育、就业等成为高频词
- 【世界新要闻】在亚丁湾护卫中国渔船
- 铁路“蛙人”的“水之道”
- 天天观热点:海南社会物流总额连续两年突破万亿元大关
- 波比的冒险时光好玩吗 波比的冒险时光玩法简介 全球百事通
- 每日时讯!海南省气象台发布海上大雾橙色预警【Ⅱ级/严重】【2023-02-02】
- 射击世界官网在哪下载 最新官方下载安装地址 今日看点
- 射击世界好玩吗 射击世界玩法简介
- 【全球报资讯】坦克射击极限生存好玩吗 坦克射击极限生存玩法简介
- 世界快报:理发小达人什么时候出 公测上线时间预告
- 海南自贸港为未来发展蓄势 重点项目加速推进|微头条
- 受益于上游资本开支增长 油服公司2022年增势喜人 速读
- 原神跟随气息的踪迹寻找食材任务完成攻略
- 环球实时:光遇云顶浮石冥想位置介绍