FSO 对象模型编程
FSO 对象模型编程包括三项主要任务:
使用CreateObject 方法,或将一个变量声明为 FileSystemObject 对象类型来创建一个 FileSystemObject 对象。
对新创建的对象使用适当的方法。
访问该对象的属性。
FSO 对象模型包含在一个称为 Scripting 的类型库中,此类型库位于 Scrrun.Dll 文件中。如果还没有引用此文件,请从“属性”菜单的“引用”对话框选择“Microsoft Scripting Runtime”项。然后就可以使用“对象浏览器”来查看其对象、集合、属性、方法、事件以及它的常数。
创建 FileSystemObject 对象
第一步是创建一个 FileSystemObject 对象以便进行处理。可以通过如下两种方法完成:
将一个变量声明为 FileSystemObject 对象类型:
Dim fso As New FileSystemObject
使用 CreateObject 方法来创建一个 FileSystemObject 对象:
Set fso = CreateObject("Scripting.FileSystemObject")
在上面的语法中, Scripting 是类型库的名称,而 FileSystemObject 则是想要创建一个实例的对象的名称。
注意 第一种方法只在 Visual Basic 中有效,而第二种方法在 Visual Basic 或 VBScript 中都是可行的。
使用适当的方法
下一步就是使用该 FileSystemObject 对象的适当的方法。例如,如果想要创建一个新对象,既可以使用 CreateFolder 方法也可以使用 CreateTextFile 方法。(FSO 对象模型不支持创建或删除驱动器。)
如果想要删除对象,可以使用 FileSystemObject 对象的 DeleteFile 和 DeleteFolder 方法,或者 File 和 Folder 对象的 Delete 方法。
使用适当的方法,还可以复制、移动文件和文件夹。
请注意, FileSystemObject 对象模型中有一些功能是冗余的。例如,要复制一个文件,既可以使用 FileSystemObject 对象的 CopyFile 方法,也可以使用 File 对象的 Copy 方法。这两者的功能是完全相同的。两者同时存在以提供最大的编程灵活性。
访问已有的驱动器、文件和文件夹
要访问一个已有的驱动器、文件或文件夹,请使用 FileSystemObject 对象中相应的 "get" 方法:
GetDrive
GetFolder
GetFile
例如:
Dim fso As New FileSystemObject, fil As File
Set fil = fso.GetFile("c:/test.txt")
但是,请注意,并不需要对新创建的对象使用"get" 方法,因为"create" 函数已经返回了一个句柄到新创建的对象。例如,如果使用 CreateFolder 方法创建了一个新的文件夹,就没有必要使用 GetFolder 方法来访问该对象的诸如名称、路径、大小等属性。只要给 CreateFolder 函数设置一个变量来获取新建文件夹的句柄,然后就可以访问其属性、方法和事件:
Private Sub Create_Folder()
Dim fso As New FileSystemObject, fldr As Folder
Set fldr = fso.CreateFolder("C:/MyTest")
MsgBox "Created folder: " & fldr.Name
End Sub
访问对象的属性
一旦有了对象的句柄,就能够访问其属性。例如,假定您想要获得一个特定文件夹的名称。首先要创建该对象的一个实例,然后通过适当的方法(在本例中是 GetFolder 方法,因为该文件夹已经存在)得到其句柄:
Set fldr = fso.GetFolder("c:/")
现在有了一个 Folder 对象的句柄,您可以查看其 Name 属性:
Debug.Print "Folder name is: "; fldr.Name
如果想要找出一个文件的最新修改时间,可以使用如下的语法:
Dim fso As New FileSystemObject, fil As File
Set fil = fso.GetFile("c:/detlog.txt") ' 获得要查询的 File 对象。
Debug.Print "File last modified: "; fil.DateLastModified ' 显示信息。
Top
2 楼tomid(磨牙狼)回复于 2002-07-01 21:09:48 得分 5API:
Long,非零表示成功,零表示失败。会设置GetLastError
----------------------
GetFileTime
VB声明
Declare Function GetFileTime Lib "kernel32" Alias "GetFileTime" (ByVal hFile As Long, lpCreationTime As FILETIME, lpLastAccessTime As FILETIME, lpLastWriteTime As FILETIME) As Long
说明
取得指定文件的时间信息
参数 类型及说明
hFile Long,文件的句柄
lpCreationTime FILETIME,用于装载文件的创建时间
lpLastAccessTime FILETIME,用于装载文件上一次访问的时间(FAT文件系统不支持这一特性)
lpLastWriteTime FILETIME,用于装载文件上一次修改的时间
----------------------
GetFileAttributes
VB声明
Declare Function GetFileAttributes Lib "kernel32" Alias "GetFileAttributesA" (ByVal lpFileName As String) As Long
说明
判断指定文件的属性
-----------------
GetFileSize
VB声明
Declare Function GetFileSize Lib "kernel32" Alias "GetFileSize" (ByVal hFile As Long, lpFileSizeHigh As Long) As Long
说明
判断文件长度
参数 类型及说明
hFile Long,文件的句柄
lpFileSizeHigh Long,指定一个长整数,用于装载一个64位文件长度的头32位。如这个长度没有超过2^32字节,则该参数可以设为NULL(变成ByVal)
Top
3 楼wwfang(晴天)回复于 2002-07-01 22:15:31 得分 5以下是我写的 DLL 中的文件操作的一部分代码,希望对你有所帮助:
Option Explicit
'获得文件时间信息
Private Declare Function GetFileTime Lib "kernel32" (ByVal hFile As Long, lpCreationTime As FileTime, lpLastAccessTime As FileTime, lpLastWriteTime As FileTime) As Long
'设置文件时间信息
Private Declare Function SetFileTime Lib "kernel32" (ByVal hFile As Long, lpCreationTime As FileTime, lpLastAccessTime As FileTime, lpLastWriteTime As FileTime) As Long
'把文件的时间信息转换为系统时间格式
Private Declare Function FileTimeToSystemTime Lib "kernel32" (lpFileTime As FileTime, lpSystemTime As SYSTEMTIME) As Long
'把文件的时间信息转换为本地时间格式
Private Declare Function FileTimeToLocalFileTime Lib "kernel32" (lpFileTime As FileTime, lpLocalFileTime As FileTime) As Long
'把系统时间转换为文件时间
Private Declare Function SystemTimeToFileTime Lib "kernel32" (lpSystemTime As SYSTEMTIME, lpFileTime As FileTime) As Long
'把本地时间转换为文件时间
Private Declare Function LocalFileTimeToFileTime Lib "kernel32" (lpLocalFileTime As FileTime, lpFileTime As FileTime) As Long
'设置文件属性
Private Declare Function SetFileAttributes Lib "kernel32" Alias "SetFileAttributesA" (ByVal lpFileName As String, ByVal dwFileAttributes As Long) As Long
Private Const FILE_ATTRIBUTE_READONLY = &H1 '
Private Const INVALID_HANDLE_VALUE = -1 '
'文件时间结构
Private Type FileTime
dwLowDateTime As Long
dwHighDateTime As Long
End Type
'系统时间结构
Private Type SYSTEMTIME
wYear As Integer
wMonth As Integer
wDayOfWeek As Integer
wDay As Integer
wHour As Integer
wMinute As Integer
wSecond As Integer
wMilliseconds As Integer
End Type
'自定义的文件时间信息常数列表
'日期:2002-6-16
Public Enum FileTimeConstants
[ftCreate] = 0
[ftModify] = 1
[ftAccess] = 2
End Enum
'获得指定日期所对应的星期
Private Function GetWeekDay(ByVal dtDate As String) As String
dtDate = CDate(dtDate) '把字符串型的时间转换成日期型
Dim intWeek As Integer
intWeek = Weekday(dtDate) '获得指定日期的星期
Select Case intWeek '根据得到的星期获得相应的中文星期
Case 1
GetWeekDay = "星期日"
Case 2
GetWeekDay = "星期一"
Case 3
GetWeekDay = "星期二"
Case 4
GetWeekDay = "星期三"
Case 5
GetWeekDay = "星期四"
Case 6
GetWeekDay = "星期五"
Case 7
GetWeekDay = "星期六"
End Select
End Function
'获得文件的时间信息
'日期:2002-6-16
Public Function GetFileTimes(ByVal sFile As String, FTime As FileTimeConstants, Optional IncludeTime As Boolean = True, Optional IncludeWeekday As Boolean = False)
On Error GoTo ErrHandle
Dim ftCreateTime As FileTime
Dim ftModifyTime As FileTime
Dim ftAccessTime As FileTime
Dim ftLocal As FileTime
Dim ftSystem As SYSTEMTIME
Dim lngHandle As Long '存放文件句柄
Dim lngAttr As Long '存放文件属性
Dim blnSetAttr As Boolean '存放设置文件属性的标记
Dim lngResult As Long '存放函数执行结果
Dim FProperties As New FileProperties
If GetAttr(sFile) And vbReadOnly Then '如果文件具有“只读”属性
blnSetAttr = True '设置标记为真
lngAttr = GetAttr(sFile) '获得文件属性
'去除文件的“只读”属性
Call SetFileAttributes(sFile, lngAttr - FILE_ATTRIBUTE_READONLY)
End If
lngHandle = FProperties.FileHandle(sFile) '获得文件句柄
If lngHandle <> INVALID_HANDLE_VALUE Then '如果获得文件句柄成功
Dim strDate As String
Dim strTime As String
Dim strWeekday As String
'获得文件的时间信息
lngResult = GetFileTime(lngHandle, ftCreateTime, ftAccessTime, ftModifyTime)
If lngResult <> 0 Then '如果获得文件时间信息成功
Select Case FTime '选择时间
Case ftCreate '创建时间
'转换文件时间到本地时间
lngResult = FileTimeToLocalFileTime(ftCreateTime, ftLocal)
Case ftModify '最后修改时间
'转换文件时间到本地时间
lngResult = FileTimeToLocalFileTime(ftModifyTime, ftLocal)
Case ftAccess '最后访问时间
'转换文件时间到本地时间
lngResult = FileTimeToLocalFileTime(ftAccessTime, ftLocal)
End Select
If lngResult <> 0 Then '如果转换文件时间到本地时间成功
'转换本地时间到系统时间
lngResult = FileTimeToSystemTime(ftLocal, ftSystem)
If lngResult <> 0 Then '如果转换本地时间到系统时间成功
With ftSystem
'获得日期
strDate = CStr(.wYear & "年" & .wMonth & "月" & .wDay & "日")
GetFileTimes = strDate
If IncludeTime Then '如果要包含时间
'获得时间
strTime = Format$(.wHour & ":" & .wMinute & ":" & .wSecond, "HH:MM:SS")
GetFileTimes = GetFileTimes & " " & strTime
End If
If IncludeWeekday Then '如果要包含星期
'获得星期
strWeekday = " " & GetWeekDay(strDate)
GetFileTimes = GetFileTimes & strWeekday
End If
End With
Else
GetFileTimes = ""
End If
Else
GetFileTimes = ""
End If
Else
GetFileTimes = ""
End If
End If
If blnSetAttr Then '如果标记为真
Call SetFileAttributes(sFile, lngAttr) '恢复文件的属性
End If
FProperties.CloseFileHandle (lngHandle) '
Set FProperties = Nothing '
ErrHandle:
If Err <> 0 Then
If blnSetAttr Then
Call SetFileAttributes(sFile, lngAttr)
End If
FProperties.CloseFileHandle (lngHandle) '
Set FProperties = Nothing
GetFileTimes = ""
End If
End Function
'设置文件的时间信息
'日期:2002-6-17
Public Function SetFileTimes(ByVal sFile As String, ByVal sDate As String, ByVal sTime As String, FTime As FileTimeConstants) As Boolean
On Error GoTo ErrHandle
Dim oldCreate As FileTime '原来的创建时间
Dim oldModify As FileTime '原来的最后修改时间
Dim oldAccess As FileTime '原来的最后访问时间
Dim NewFileTime As FileTime '新的时间
Dim localFileTime As FileTime '存放本地时间
Dim sysFileTime As SYSTEMTIME '存放系统时间
Dim lngResult As Long '存放函数执行结果
Dim lngHandle As Long '存放获得的文件句柄
Dim FProperties As New FileProperties '新的 FileProperties 对象
Dim tDate As Date '存放日期
Dim tTime As Date '存放时间
SetFileTimes = True '先假设函数执行成功
tDate = CDate(sDate) '转换传入的日期
tTime = CDate(sTime) '转换传入的时间
lngHandle = FProperties.FileHandle(sFile) '获得文件句柄
'获得文件原来的时间信息
lngResult = GetFileTime(lngHandle, oldCreate, oldAccess, oldModify)
'设置系统时间的内容
With sysFileTime
.wYear = Year(tDate)
.wMonth = Month(tDate)
.wDay = Day(tDate)
.wHour = Hour(tTime)
.wMinute = Minute(tTime)
.wSecond = Second(tTime)
.wMilliseconds = 0
End With
'把系统时间转换为本地时间
lngResult = SystemTimeToFileTime(sysFileTime, localFileTime)
'把本地时间转换为文件时间
lngResult = LocalFileTimeToFileTime(localFileTime, NewFileTime)
Select Case FTime '选择传入的时间类型
Case ftCreate '创建时间
'设置创建时间
lngResult = SetFileTime(lngHandle, NewFileTime, oldAccess, oldModify)
Case ftModify '最后修改时间
'设置最后修改时间
lngResult = SetFileTime(lngHandle, oldCreate, oldAccess, NewFileTime)
Case ftAccess '最后访问时间
'设置最后访问时间
lngResult = SetFileTime(lngHandle, oldCreate, NewFileTime, oldModify)
End Select
If lngResult = 0 Then '如果设置文件时间失败
SetFileTimes = False
End If
FProperties.CloseFileHandle (lngHandle) '关闭打开的文件句柄
Set FProperties = Nothing '清除 FProperties 对象占用的内存
ErrHandle:
If Err <> 0 Then
FProperties.CloseFileHandle (lngHandle) '
Set FProperties = Nothing
SetFileTimes
Top
4 楼wwfang(晴天)回复于 2002-07-01 22:16:37 得分 5接上面
'设置文件属性的 API 函数
Private Declare Function SetFileAttributes Lib "kernel32" Alias "SetFileAttributesA" (ByVal lpFileName As String, ByVal dwFileAttributes As Long) As Long
'自定义的文件属性常数列表
'日期:2002-6-16
Public Enum FileAttributeConstants
[attrArchive] = &H20 '“存档”属性
[attrHidden] = &H2 '“隐藏”属性
[attrNormal] = &H80 '“普通”属性
[attrReadonly] = &H1 '“只读”属性
[attrSystem] = &H4 '“系统”属性
End Enum
'测试文件是否具有“存档”属性
'日期:2002-6-16
Public Function IsArchive(ByVal sFile As String) As Boolean
On Error Resume Next
IsArchive = IIf((GetAttr(sFile) And vbArchive), True, False)
End Function
'测试文件是否具有“只读”属性
'日期:2002-6-16
Public Function IsReadonly(ByVal sFile As String) As Boolean
On Error Resume Next
IsReadonly = IIf((GetAttr(sFile) And vbReadOnly), True, False)
End Function
'测试文件是否具有“隐藏”属性
'日期:2002-6-16
Public Function IsHidden(ByVal sFile As String) As Boolean
On Error Resume Next
IsHidden = IIf((GetAttr(sFile) And vbHidden), True, False)
End Function
'测试文件是否具有“系统”属性
'日期:2002-6-16
Public Function IsSystem(ByVal sFile As String) As Boolean
On Error Resume Next
IsSystem = IIf((GetAttr(sFile) And vbSystem), True, False)
End Function
'测试文件是否具有“普通”属性
'日期:2002-6-16
Public Function IsNormal(ByVal sFile As String) As Boolean
If IsArchive(sFile) Then
IsNormal = False
Exit Function
End If
If IsReadonly(sFile) Then
IsNormal = False
Exit Function
End If
If IsHidden(sFile) Then
IsNormal = False
Exit Function
End If
If IsSystem(sFile) Then
IsNormal = False
Exit Function
End If
IsNormal = True
End Function
'设置文件属性
'日期:2002-6-16
Public Function SetFileAttribute(ByVal sFile As String, Attributes As FileAttributeConstants) As Boolean
On Error GoTo ErrHandle
SetFileAttribute = CBool(SetFileAttributes(sFile, Attributes))
ErrHandle:
If Err <> 0 Then
SetFileAttribute = False
End If
End Function
Top
5 楼wwfang(晴天)回复于 2002-07-01 22:19:18 得分 5接上面
Option Explicit
'获得指定文件的 DOS 文件路径及文件名
Private Declare Function GetShortPathName Lib "kernel32" Alias "GetShortPathNameA" (ByVal lpszLongPath As String, ByVal lpszShortPath As String, ByVal cchBuffer As Long) As Long
'关闭句柄
Private Declare Function CloseHandle Lib "kernel32" (ByVal hObject As Long) As Long
'获得句柄
Private Declare Function CreateFile Lib "kernel32" Alias "CreateFileA" (ByVal lpFileName As String, ByVal dwDesiredAccess As Long, ByVal dwShareMode As Long, lpSecurityAttributes As Any, ByVal dwCreationDisposition As Long, ByVal dwFlagsAndAttributes As Long, ByVal hTemplateFile As Long) As Long
Private Const CREATE_NEW = 1 '创建文件;如文件存在则会出错
Private Const GENERIC_READ = &H80000000 '表示允许对文件进行读访问
Private Const GENERIC_WRITE = &H40000000 '表示允许对文件进行写访问
Private Const FILE_SHARE_WRITE = &H2 '表示允许对文件进行共享写访问
Private Const FILE_SHARE_READ = &H1 '表示允许对文件进行共享读访问
Private Const OPEN_EXISTING = 3 '打开已存在的文件
Private Const OPEN_ALWAYS = 4 '如文件不存在则创建它
Private Const FILE_FLAG_OVERLAPPED = &H40000000 '允许对文件进行重叠操作
Private Const INVALID_HANDLE_VALUE = -1
'获得指定文件的信息
Private Declare Function SHGetFileInfo Lib "shell32.dll" Alias "SHGetFileInfoA" (ByVal pszPath As String, ByVal dwFileAttributes As Long, psfi As SHFILEINFO, ByVal cbFileInfo As Long, ByVal uFlags As Long) As Long
'在指定的设备是画图形
Private Declare Function ImageList_Draw Lib "comctl32.dll" (ByVal himl As Long, ByVal i As Long, ByVal hdcDst As Long, ByVal X As Long, ByVal Y As Long, ByVal fStyle As Long) As Long
Private Const MAX_PATH = 260
Private Const ILD_TRANSPARENT = &H1 'Display transparent
Private Const SHGFI_DISPLAYNAME = &H200
Private Const SHGFI_EXETYPE = &H2000
Private Const SHGFI_SYSICONINDEX = &H4000 'System icon index
Private Const SHGFI_LARGEICON = &H0 'Large icon
Private Const SHGFI_SMALLICON = &H1 'Small icon
Private Const SHGFI_SHELLICONSIZE = &H4
Private Const SHGFI_TYPENAME = &H400
Private Const BASIC_SHGFI_FLAGS = SHGFI_TYPENAME _
Or SHGFI_SHELLICONSIZE Or SHGFI_SYSICONINDEX _
Or SHGFI_DISPLAYNAME Or SHGFI_EXETYPE
'文件信息类型
Private Type SHFILEINFO
hIcon As Long ' out: icon
iIcon As Long ' out: icon index
dwAttributes As Long ' out: SFGAO_ flags
szDisplayName As String * MAX_PATH ' out: display name (or path)
szTypeName As String * 80 ' out: type name
End Type
'从缓冲区中获得字符串
'日期:2002-6-21
Private Function GetString(ByVal sBuffer As String) As String
On Error Resume Next
Dim lngPos As Long
lngPos = InStr(1, sBuffer, Chr$(0))
If lngPos > 0 Then
GetString = Left$(sBuffer, lngPos - 1)
Else
GetString = sBuffer
End If
End Function
'获得指定文件的句柄
'日期:2002-6-16
Public Function FileHandle(ByVal sFile As String) As Long
On Error GoTo ErrHandle
Dim lngResult As Long
'利用 CreateFile API 函数获得文件的句柄(注意:文件必须存在)
'FileHandle = CreateFile(sFile, 0, 0, ByVal 0&, OPEN_EXISTING, 0, ByVal 0&)
lngResult = CreateFile(sFile, GENERIC_READ Or GENERIC_WRITE, FILE_SHARE_READ Or FILE_SHARE_WRITE, ByVal 0&, OPEN_EXISTING, 0, 0)
FileHandle = IIf(lngResult = INVALID_HANDLE_VALUE, -1, lngResult)
ErrHandle:
If Err <> 0 Then
FileHandle = -1
End If
End Function
'关闭指定文件的句柄
'日期:2002-6-16
Public Function CloseFileHandle(lHandle As Long) As Boolean
On Error GoTo ErrHandle
Dim lngResult As Long
lngResult = CloseHandle(lHandle)
CloseFileHandle = IIf(lngResult = 0, False, True)
ErrHandle:
If Err <> 0 Then
CloseFileHandle = False
End If
End Function
'获得指定文件的文件名(不包括路径)
'日期:2002-6-16
Public Function FileName(ByVal sFile As String, Optional IncludeExtension As Boolean = True) As String
On Error GoTo ErrHandle
Dim strFileName As String
If Trim$(sFile) = "" Then '如果传入的文件名为空
FileName = "" '函数返回空值
Exit Function '退出函数
End If
Dim i As Long
For i = Len(sFile) To 1 Step -1 '从后向前遍历文件名的每个字符
If Mid$(sFile, i, 1) = "/" Then '如果等于“/”
strFileName = Mid$(sFile, i + 1) '获得文件名
If IncludeExtension Then
FileName = strFileName
Else
Dim lngExtension As Long
lngExtension = Len(FileExtension(strFileName))
If lngExtension <> 0 Then
FileName = Left$(strFileName, Len(strFileName) - lngExtension - 1)
Else
FileName = strFileName
End If
End If
Exit Function '退出过程
End If
Next i
ErrHandle:
If Err <> 0 Then
FileName = ""
Exit Function
End If
End Function
Top
6 楼ayusay(阿于)回复于 2002-07-25 18:54:19 得分 3Dim fso As Object
Dim fil As Object
Set fso = CreateObject("Scripting.FileSystemObject")
Set fil = fso.GetFile("D:/Documents and Settings/Administrator/Local Settings/Temp/~ce1AD.tmp")
With fil
Debug.Print "文件名:" & .Name
Debug.Print "文件" & .Name & "的大小:" & .Size
Debug.Print "文件" & .Name & "的类型:" & .Type
Debug.Print "文件" & .Name & "的建立日期:" & .DateCreated
Debug.Print "文件" & .Name & "的最后访问日期:" & .DateLastAccessed
Debug.Print "文件" & .Name & "的最后修改日期:" & .DateLastModified
Debug.Print "文件" & .Name & "所在驱动器:" & .Drive
Debug.Print "文件" & .Name & "所在文件夹:" & .ParentFolder
Debug.Print "文件" & .Name & "文件名(不支持长文件名):" & .ShortName
Debug.Print "文件" & .Name & "完整路径(支持长文件名):" & .Path
Debug.Print "文件" & .Name & "完整路径(不支持长文件名):" & .ShortPath
End With