【引用地址】http://club.excelhome.net/blog-238368-1693.html
一個高手的代碼:遍歷文件夾下的文件夾
Public Fso As Object
****Sub getFldList()
Set Fso = CreateObject("Scripting.FileSystemObject")
Fldnm (CreateObject("Shell.Application").BrowseForFolder(0, "請選擇文件夾", 0, "").Self.Path & "")
End Sub
Function Fldnm(pth$)
Dim Fld
[A65536].End(3)(2) = pth
For Each Fld In Fso.getfolder(pth).subfolders
Fldnm (Fld)
Next
End Function
VBA FSO****對象模型詳解
一、簡****介
文件系統對象FSO的英文全稱是File System Object ,這種對象模型提出了有別于傳統的文件操作語句處理文件和文件夾的方法。通過采用object.method這種在面向對象編程中廣泛使用的語法,將一系列操作文件和文件夾的動作通過調用對象本身的屬性直接實現。
FSO 對象模型不僅可以象使用傳統文件操作語句那樣實現文件的創建、改變、移動和刪除,而且可以檢測是否存在指定的文件夾,如果存在,那么,這個文件夾又位于磁盤上的什么位置。更令人高興的是FSO 對象模型還可以獲取關于文件和文件夾的信息,如名稱、創建日期或最近修改日期等以及當前系統中使用的驅動器的信息,如驅動器的種類是CD-ROM還是可移動磁盤,當前磁盤的剩余空間還有多少。而以前要獲取這些信息必須通過調用Windows API函數集中的相應函數才能實現。
FSO對象模型包含在Scripting 類型庫 (Scrrun.Dll)中,它同時<u .="text-underline: wave" style="word-wrap: break-word;">包含了</u>****<u .="text-underline: wave" style="word-wrap: break-word;">Drive</u>****<u .="text-underline: wave" style="word-wrap: break-word;">、</u>****<u .="text-underline: wave" style="word-wrap: break-word;">Folder</u>****<u .="text-underline: wave" style="word-wrap: break-word;">、</u>****<u .="text-underline: wave" style="word-wrap: break-word;">File</u>****<u .="text-underline: wave" style="word-wrap: break-word;">、</u>****<u .="text-underline: wave" style="word-wrap: break-word;">FileSystemObject</u>****<u .="text-underline: wave" style="word-wrap: break-word;">和</u>****<u .="text-underline: wave" style="word-wrap: break-word;">TextStream</u>****<u .="text-underline: wave" style="word-wrap: break-word;">五個對象</u>。其中Drive用來收集驅動器的信息,如可用磁盤空間或驅動器的類型;Folder用于創建、刪除或移動文件夾,同時可以進行向系統查詢文件夾的路徑等操作;File的基本操作和Folder基本相同,所不同的是Files的操作主要是針對磁盤上的文件進行的;FileSystemObject是FSO對象模型中最主要對象,它提供了一套完整的可用于創建、刪除文件和文件夾,收集驅動器、文件夾、文件相關信息的方法。需要注意的是,FSO對象模型提供的方法是冗余的,也就是說在實際使用中,FSO對象模型中包含的不同對象的不同方法進行的卻是同樣的操作,而且FileSystemObject對象的方法直接作用于其余對象,所以在后面的文章中并沒有單獨提到FileSystemObject對象,千萬不要以為沒有提到就不重要,事實上FileSystemObject對象在整個FSO對象模型中無處不在;最后的TextStream對象則是用來完成對文件的讀寫操作的。
創建****FSO****對象模型:
由于FSO對象包含在Scripting 類型庫 (Scrrun.Dll)中,所以在使用前首先需要在在工程中引用這個文件,單擊“工程”,“引用”,然后在“引用”對話框中選中“Microsoft Scripting Runtime”前的復選框,然后單擊“確定”。
要創建FSO對象可以采用兩種方法,一種是將一個變量聲明為FSO對象類型:Dim fsoTest As New FileSystemObject;另一種是通過CreateObject方法創建一個FSO 對象:Set fsoTest = CreateObject(“Scripting.FileSystemObject")。在實際使用中具體采用哪種聲明方法,可根據個人的使用習慣而定。
完成了FSO對象模型的創建之后,就可以利用創建的對象模型的方法訪問下屬各個對象的屬性來獲取所需信息或進行相關操作了
FileSystemObject對象有許多用來操作文件系統的方法和屬性。下面先看一個例子,如下面的代碼:
Sub FileInfo( )
Dim fs As Object
Dim objFile As Object
Dim strMsg As String
Set fs = CreateObject("Scripting.FileSystemObject")
Set objFile = fs.GetFile("C:\Windows\System.ini")
strMsg = "文件名:" & objFile.Name & vbCrLf
strMsg = strMsg & "硬盤:" & objFile.Drive & vbCrLf
strMsg = strMsg & "創建日期:" & objFile.DateCreated & vbCrLf
strMsg = strMsg & "修改日期:" & objFile.DateLastModified & vbCrLf
MsgBox strMsg, , "文件信息"
End Sub
FileInfo過程首先使用CreateObject函數創建一個FileSystemObject對象,用來訪問計算機的文件系統。然后,使用GetFile方法創建一個File對象并返回對System.ini文件的引用。接著,利用File對象的Name屬性、Drive屬性、DateCreated屬性、DateLastModified屬性返回文件的相應信息。
二、****FileSystemObject****中的對象的方法和屬性
(一)****FSO****對象
l ****屬性:
1****、****Drives****屬性
Drives屬性是FileSystemObject對象唯一的屬性,返回對硬盤驅動器集合(Drives)的引用,是一個只讀屬性。其語法為:
oFileSysObj.Drives
其中,oFileSysObj代表任何能夠返回FileSystemObject對象的對象變量。
Drives屬性返回的集合中的每個成員都是Drive對象,表示系統中一個可用的驅動器。可以使用For … Next循環迭代系統中所有驅動器,或者使用Drives集合的Item方法讀取某個Drive對象(代表系統中的某個驅動器)。
例如,下面的代碼創建計算機驅動盤清單:
Sub DrivesList( )
Dim fs As Object
Dim colDrives As Object
Dim Drive As Object
Dim strDrive As String
Set fs = CreateObject("Scripting.FileSystemObject")
Set colDrives = fs.Drives
For Each Drive In colDrives
strDrive = "驅動器" & Drive.DriveLetter & ":"
Debug.Print strDrive
Next
End Sub
l ****方法:
1****、****BuildPath****方法
其語法為:
oFileSysObj.BuildPath (Path,Name)
其中,oFileSysObj為任何能夠返回FileSystemObject對象的對象變量。參數Path必需,指定驅動器或文件夾路徑,String類型,可以是絕對路徑也可以是相對路徑,不一定要包含驅動器名。參數Name必需,指定附加在Path后的文件夾或文件路徑,String類型。參數Path或Name都不一定要求是當前已經存在的路徑或文件夾。
BuildPath方法通過合并參數Path和文件夾或文件名生成一個字符串,并且在必要的地方加上正確的主機系統路徑分隔符。該方法不能檢驗新的文件夾或文件名的有效性。
與人工合并兩個字符串相比,使用BuildPath函數的惟一好處就是它能夠選擇正確的路徑分隔符。
2****、****FileExists****方法
FileExists方法用于判斷指定的文件是否存在,若存在則返回True。其語法為:
oFileSysObj.FileExists(FileSpec)
其中,oFileSysObj代表任何能夠返回FileSystemObject對象的對象。參數FileSpec必需,代表文件的完整路徑,String類型,不能包含有通配符。
如果用戶有充分的權限,FileSpec可以是網絡路徑或共享名,例如:
If ofs.FileExists("\TestPath\Test.txt") Then
示例
Sub IfFileExists( )
Dim fs As Object
Dim strFile As String
Set fs = CreateObject("Scripting.FileSystemObject")
strFile = InputBox("請輸入文件的完整名稱:")
If fs.FileExists(strFile) Then
MsgBox strFile & "已經找到."
Else
MsgBox "該文件不存在."
End If
End Sub
3****、****GetFile****方法
GetFile方法用來返回一個File對象。其語法為:
oFileSysObj.GetFile (FilePath)
其中,oFileSysObj代表任何能夠返回FileSystemObject對象的對象變量。參數FilePath必需,指定路徑和文件名,String類型。可以是絕對路徑或相對路徑。如果FilePath是一個共享名或網絡路徑,GetFile確認該驅動器或共享是File對象創建進程的一部分。如果參數FilePath指定的路徑的任何部分不能連接或不存在,就會產生錯誤。
GetFile方法返回的是File對象,而不是TextStream對象。File對象不是打開的文件,主要是用來完成如復制或移動文件和詢問文件的屬性之類的方法。盡管不能對File對象進行寫或讀操作,但可以使用File對象的OpenAsTextStream方法獲得TextStream對象。
要獲得所需的FilePath字符串,首先應該使用GetAbsolutePathName方法。如果FilePath包含網絡驅動器或共享,可以在調用GetFile方法之前用DriveExists方法來檢驗所需的驅動器是否可用。
因為在FilePath指定的文件不存在時會產生錯誤,所以應該在調用GetFile之前調用FileExists方法確定文件是否存在。
必須用Set語句將File對象賦給一個局部對象變量。
4****、****GetFileName****方法
GetFileName方法返回給定路徑的文件名稱部分。其語法為:
oFileSysObj.GetFileName (Path)
其中,oFileSysObj表示任何能夠返回FileSystemObject對象的對象變量。參數Path必需,指定路徑說明,String類型。如果不能從給定的Path確定文件名,則返回一個零長字符串(”")。Path可以為絕對路徑或相對路徑。
GetFileName方法不能檢驗Path中是否存在指定的文件。Path可以為網絡驅動器或共享。GetFileName本身不具有智能,它認為字符串中不屬于驅動器說明的最后部分就是一個文件名,更像是一個字符串處理函數而不是對象處理方法。
5****、****GetFileVersion****方法
GetFileVersion方法返回文件的版本。
6****、****CopyFile****方法
CopyFile方法用來復制文件,將文件從一個文件夾復制到另一個文件夾。其語法為:
oFileSysObj.CopyFile Source,Destination [,OverwriteFiles]
其中,oFileSysObj代表任何能夠返回FileSystemObject對象的對象變量。參數Source必需,指定要復制的文件的路徑和名稱,String類型。參數Destination必需,代表復制文件的目標路徑和文件名(可選),String類型。參數OverwriteFiles可選,表示是否覆蓋一個現有文件的標志,True表示覆蓋,False表示不覆蓋,Boolean類型,默認值為True。
參數source中源路徑可以是絕對路徑或相對路徑,源文件名可包含通配符但源路徑不能。在參數Destination中不能包含通配符。
如果目標路徑或文件設置為只讀,則無論OverwriteFiles參數的值如何,都將無法完成CopyFile方法。如果參數OverwriteFiles設置為False且Destination指定的文件已經存在,則會產生一個運行時錯誤“文件已經存在”。如果在復制多個文件時出現錯誤,CopyFile方法將立即停止復制操作,該方法不具有撤銷錯誤前文件復制操作的返回功能。如果用戶有充分的權限,那么source或destination可以是網絡路徑或共享名,例如:
CopyFile "\NTSERV1\RootTest\test.txt","C:\RootOne"
CopyFile方法可以復制一個保存在特定文件夾中的文件。如果文件夾本身有包含文件的子文件夾,則使用CopyFile方法不能復制這些文件,應該使用CopyFolder方法。
例如:
Sub CopyFile( )
Dim fs As Object
Dim strFile As String
Dim strNewFile As String
strFile = "C:\test.doc"
strNewFile = "C:\Program Files\test.doc"
Set fs = CreateObject("Scripting.FileSystemObject")
fs.CopyFile strFile, strNewFile
MsgBox "已經創建了指定文件的副本."
Set fs = Nothing
End Sub
7****、****CreateTextFile****方法
CreateTextFile方法創建一個新的文件并返回其TextStream對象,其語法為:
oFileSysObj.CreateTextFile Filename [,Overwrite[,Unicode]]
其中,oFileSysObj代表任何能夠返回FileSystemObject對象的對象變量。參數Filename必需,代表任何有效文件名,String類型。在Filename中不允許使用通配符。Filename可以是相對路徑也可以是絕對路徑,如果沒有指定路徑,則使用應用程序的當前驅動器或文件夾作為路徑。如果指定的路徑不存在,則該方法將失敗。
參數Overwrite可選,作為一個標志,指定是否覆蓋一個具有相同文件名的現有文件,Boolean類型。默認值為False。
參數Unicode可選,作為一個標志,指明用Unicode格式還是ASCⅡ格式寫文件,Boolean類型。如果設置為True,則以Unicode格式創建文件,否則創建一個ASCⅡ文本文件。默認值為False。
只有寫操作才能使新創建的文本文件自動打開,如果以后希望讀取該文件,則必須選關閉它再以讀模式重新打開該文件。
如果參數Filename中指定的路徑設置為只讀,則不論參數Overwrite的值如保,CreateTextFile方法都將失敗。
如果用戶有充分的權限,那么參數Filename可以是網絡路徑或共享名,例如:
CreateTextFile "\NTSERV1\RootTest\myFile.doc"
必須使用Set語句將TextStream對象賦值給局部對象變量。
8****、****MoveFile****方法
MoveFile方法用來移動文件,將文件從一個文件夾移動到另一個文件夾。其語法為:
oFileSysObj.MoveFile source,destination
其中,oFileSysObj代表任何能夠返回FileSystemObject對象的對象變量。參數source必需,指定要移動的文件的路徑,String類型。參數destination必需,指定文件移動操作中的目標位置的路徑,String類型。
如果Source包含通配符或者destination以路徑分隔符結尾,則認為destination是一個路徑,否則認為destination的最后一部分是文件名。
如果目標文件已經存在,則將出現一個錯誤。
source可以包含通配符,但只能出現在它的最后一部分中。
destination參數不能包含通配符。
source或destination可以是相對路徑或絕對路徑,可以是網絡路徑或共享名。
MoveFile方法在開始操作前先解析source和destination這兩個參數。
9****、****DeleteFile****方法
DeleteFile方法刪除指定的一個或多個文件。其語法為:
oFileSysObj.DeleteFile FileSpec[,Force]
其中,oFileSysObj代表任何能夠返回FileSystemObject對象的對象變量。參數FileSpec必需,代表要刪除的單個文件或多個文件的名稱和路徑,String類型,可以在路徑的最后部分包含通配符,可以為相對路徑或絕對路徑。如果在FileSpec中只有文件名,則認為該文件在應用程序的當前驅動器和文件夾中。參數Force可選,如果將其設置為True,則忽略文件的只讀標志并刪除該文件,Boolean類型,默認值為False。
如果指定要刪除的文件已經打開,該方法將失敗并出現一個“Permission Denied”錯誤。如果找不到指定的文件,則該方法失敗。
如果在刪除多個文件的過程中出現錯誤,DeleteFile方法將立即停止刪除操作,即不能刪除余下的文件部分。該方法不具有撤銷產生錯誤前文件刪除操作的返回功能。
如果用戶有充分的權限,源路徑或目標路徑可以是網絡路徑或共享名。例如:
DeleteFile “\NTSERV1\RootTest\MyFile.doc”
DeleteFile方法永久性地刪除文件,并不把這些文件移到回收站中。
示例
Sub DeleteFile()
Dim fs As FileSystemObject
Set fs = New FileSystemObject
fs.DeleteFile "C:\test.doc"
MsgBox "刪除了該文件."
End Sub
10****、****DriveExists****方法
DriveExists方法用來判斷在本地計算機或者網絡上是否存在指定的磁盤,若存在則返回True。其語法為:
oFileSysObj.DriveExists (DriveSpec)
其中,oFileSysObj代表任何能夠返回FileSystemObject對象的對象變量。參數DriveSpec必需,代表路徑或驅動器名,String類型。如果DriveSpec是一個Windows驅動器名,則其后面不需要跟冒號,例如“C”和“C:”是一樣的。
DriveExists方法不能返回可移動驅動器的當前狀態,要實現這一目的,必須使用指定驅動器的IsReady屬性。
如果用戶有充分的權限,DriveSpec可以是網絡路徑或共享名,例如:
If ofs.DriveExists("\NTESERV1\d$") Then
在調用位于某驅動器上一個遠程ActiveX服務器中的函數前,最好先使用DriveExists方法檢測網絡上是否存在該驅動器。
示例
Function DriveExists(disk)
Dim fs As Object
Dim strMsg As String
Set fs = CreateObject("Scripting.FileSystemObject")
If fs.DriveExists(disk) Then
strMsg = "驅動器" & UCase(disk) & "盤已存在."
Else
strMsg = UCase(disk) & "盤未找到."
End If
DriveExists = strMsg
End Function
11****、****GetDrive****方法
GetDrive方法返回Drive對象,即獲得對指定驅動器的Drive對象的引用。其語法為:
oFileSysObj.GetDrive (drivespecifier)
其中,oFileSysObj代表任何能夠返回FileSystemObject對象的對象變量。參數drivespecifier必需,代表驅動器名、共享名或網絡路徑,String類型。如果drivespecifier是一個共享名或網絡路徑,GetDrive確認它是Drive對象創建進程的一部分,否則會產生運行時錯誤“找不到路徑”。如果指定的驅動器沒有連接上或者不存在,則會出現運行時錯誤“設備不可用”。
如果要從路徑中導出drivespecifier字符串,應該首先用GetAbsolutePathName來確保驅動器是路徑的一部分,然后在調用GetDriveName從全限定路徑中提取出驅動器之前,用FolderExists方法檢驗路徑是否有效,例如:
Dim oFileSys As New FileSystemObject
Dim oDrive As Drives
Path=oFileSys.GetAbsolutePathName(sPath)
If oFileSys.FolderExists(sPath) Then
set oDrive=oFileSys.GetDrive(oFileSys.GetDriveName(sPath))
End If
如果driverspecifier是一個網絡驅動器或共享,在調用GetDrive方法之前,應該用DriveExists方法檢驗所需的驅動器是否可用。
必須用Set語句將Drive對象賦給局部對象變量。
示例
Sub DriveInfo()
Dim fs, disk, infoStr, strDiskName
strDiskName = InputBox("輸入驅動器盤符:", "驅動器名稱", "C:") Set fs = CreateObject("Scripting.FileSystemObject")
Set disk = fs.GetDrive(fs.GetDriveName(strDiskName))
infoStr = "驅動器:" & UCase(strDiskName) & vbCrLf
infoStr = infoStr & "驅動器盤符:" & UCase(disk.DriveLetter) & vbCrLf
infoStr = infoStr & "驅動器類型:" & disk.DriveType & vbCrLf
infoStr = infoStr & "驅動文件系統:" & disk.FileSystem & vbCrLf
infoStr = infoStr & "驅動器系列號:" & disk.SerialNumber & vbCrLf
infoStr = infoStr & "字節的總大小:" & FormatNumber(disk.TotalSize / 1024, 0) & "kb" & vbCrLf
infoStr = infoStr & "驅動器中的自由空間:" & FormatNumber(disk.FreeSpace / 1024, 0) & "kb" & vbCrLf
MsgBox infoStr, vbInformation, "驅動器信息"
End Sub
12****、****GetDriveName****方法
GetDriveName方法返回一個包含硬盤名稱或者網絡共享名稱的字符串。即返回給定路徑的驅動器名,如果從給定的路徑中不能確定驅動器名,則返回一個零長字符串(””)。其語法為:
oFileSysObj.GetDriveName (Path)
其中,oFileSysObj代表任何能夠返回FileSystemObject對象的對象變量。參數Path必需,指定路徑,String類型。
GetDriveName不能檢驗Path中是否存在指定的驅動器。Path可以是網絡驅動器或共享。
示例
Function DriveName(disk)
Dim fs As Object
Dim strDiskName As String
Set fs = CreateObject("Scripting.FileSystemObject")
strDiskName = fs.GetDriveName(disk)
DriveName = strDiskName
End Function
13****、****GetExtensionName****方法
返回給定路徑中文件的擴展名。其語法為:
oFileSysObj.GetExtensionName (Path)
其中,oFileSysObj代表任何能夠返回FileSystemObject對象的對象變量。參數Path必需,表示路徑說明,String類型。如果不能確定Path中的擴展名,則返回一個零長字符串。
GetExtensionName方法不能檢驗Path是否有效,Path可以為網絡路徑或共享。GetExtensionName沒有智能功能,它簡單地解析一個字符串,并返回Path最后部分中最后一個點后的文本。
14****、****FolderExists****方法
FolderExists方法可以判斷指定的文件夾是否存在,若存在則返回True。其語法為:
oFileSysObj.FolderExists(FolderSpec)
其中,oFileSysObj代表任何能夠返回FileSystemObject對象的對象變量。參數FolderSpec指定文件夾的完整路徑,String類型,不能包含通配符。
如果用戶有充分的權限,FolderSpec可以是網絡路徑或共享名,例如:
If ofs.FileExists ("\NTSERV1\d$\TestPath") Then
示例
Sub IfFolderExists( )
Dim fs As Object
Set fs = CreateObject("Scripting.FileSystemObject")
MsgBox fs.FolderExists("C:\Program Files")
End Sub
15****、****GetAbsolutePathName****方法
將相對路徑轉變為一個全限定路徑(包括驅動器名),返回一個字符串,包含一個給定的路徑說明的絕對路徑。其語法為:
oFileSysObj.GetAbsolutePathName (Path)
其中,oFileSysObj代表任何能夠返回FileSystemObject對象的對象變量。參數Path必需,代表路徑說明,String類型。
“.”返回當前文件夾的驅動器名和完整路徑。“..”返回當前文件夾的父文件夾的驅動器名和路徑。“filename”返回當前文件夾中的文件的驅動器名、路徑及文件名。
所有相對路徑名均以當前文件夾為基準。
如果沒有明確地提供驅動器作為Path的一部分,就以當前驅動器作為Path參數中的驅動器。在Path中可以包含任意個通配符。
對于映射網絡驅動器和共享而言,這種方法不能返回完整的網絡地址,而是返回全限定的本地路徑和本地驅動器名。
GetAbsolutePathName不能檢驗指定路徑中是否存在某個給定的文件或文件夾。
16****、****GetBaseName****方法
返回路徑的最后部分的名稱,不包含擴展名。其語法為:
oFileSysObj.GetBaseName (Path)
其中,oFileSysObj代表任何能夠返回FileSystemObject對象的對象變量。參數Path必需,代表路徑說明,String類型。Path中最后部分的文件擴展名不包含在返回的字符串中。
GetBaseName方法不能檢驗Path中是否存在給定的文件或文件夾。GetBaseName方法沒有舍去文件擴展名并返回Path的基本名稱的智能功能。也就是說,它不能識別路徑的最后部分是路徑還是文件名。如果最后部分包括一個或多個點“.”,它僅僅刪除最后一個占以及該點后的文本。所以如果Path為“.”,GetBaseName方法返回一個空字符串;如果Path為“..”,GetBaseName方法返回“.”。換句話說,它只不過是一個字符串處理函數,而不是一個文件函數。
17****、****GetFolder****方法
GetFolder方法返回Folder對象。其語法為:
oFileSysObj.GetFolder (FolderPath)
其中,oFileSysObj代表任何能返回FileSystemObject對象的對象變量。參數FolderPath必需,指定所需文件夾的路徑,String類型,可以為相對路徑或絕對路徑。如果FolderPath是共享名或網絡路徑,GetFolder確認該驅動器或共享是File對象創建進程的一部分。如果FolderPath的任何部分不能連接或不存在,就會產生一個錯誤。
要獲得所需的Path字符串,首先應該使用GetAbsolutePathName方法。如果FolderPath包含一個網絡驅動器或共享,可以在調用GetFolder方法之前使用DriveExists方法確認指定的驅動器是否可用。由于GetFolder方法要求FolderPath是一個有效文件夾的路徑,所以應調用FolderExists方法來檢驗FolderPath是否存在。
必須使用Set語句將Folder對象賦給一個局部對象變量。
示例
Sub FilesInFolder( )
Dim fs As Object
Dim objFolder As Object
Dim objFile As Object
Set fs = CreateObject("Scripting.FileSystemObject")
Set objFolder = fs.GetFolder("C:")
Workbooks.Add
For Each objFile In objFolder.Files
ActiveCell.Select
Selection.Formula = objFile.Name
ActiveCell.Offset(0, 1). Select
Selection.Formula = objFile.Type
ActiveCell.Offset(1, -1). Select
Next
Columns("A:B").Select
Selection.Columns.AutoFit
End Sub
18****、****GetParentFolderName****方法
返回給定路徑中最后部分前的文件夾名,其語法為:
oFileSysObj.GetParentFolderName (Path)
其中,oFileSysObj代表任何能夠返回FileSystemObject對象的對象變量。參數Path必需,指定路徑說明,String類型。
如果從Path中不能確定父文件夾名,就返回一個零長字符串(””)。Path可以為相對路徑或絕對路徑。可以是網絡驅動器或共享。
GetParentFolderName方法不能檢驗Path的某個部分是否存在。
GetParentFolderName方法認為Path中不屬于驅動器說明的那部分字符串除了最后一部分外余下的字符串就是父文件夾。除此之外它不做任何其他檢測,更像是一個字符串解析和處理例程而不是與對象處理有關的例程。
19****、****GetSpecialFolder****方法
GetSpecialFolder方法返回操作系統文件夾路徑,其中0代表Windows文件夾,1代表System(系統)文件夾,2代表Temp(臨時)文件夾。其語法為:
oFileSysObj.GetSpecialFolder (SpecialFolder)
其中,oFileSysObj代表任何能夠返回FileSystemObject對象的對象變量。參數SpecialFolder必需,為特殊的文件夾常數,表示三種特殊系統文件夾中其中一個的值。
可以使用Set語句將Folder對象賦給一個局部對象變量,但是如果只對檢索特殊的文件夾感興趣,就可以使用下列語句來實現:
sPath=oFileSys.GetSpecialFolder (iFolderConst)
或:
sPath=oFileSys.GetSpecialFolder (iFolderConst).Path
由于Path屬性是Folder對象的缺省屬性,所認第一個語句有效。因為不是給一個對象變量賦值,所以賦給sPath的值是缺省的Path屬性值,而不是對象引用。
示例
Sub SpecialFolders( )
Dim fs As Object
Dim strWindowsFolder As String
Dim strSystemFolder As String
Dim strTempFolder As String
Set fs = CreateObject("Scripting.FileSystemObject")
strWindowsFolder = fs.GetSpecialFolder(0)
strSystemFolder = fs.GetSpecialFolder(1)
strTempFolder = fs.GetSpecialFolder(2)
MsgBox strWindowsFolder & vbCrLf & strSystemFolder & vbCrLf _
& strTempFolder, vbInformation + vbOKOnly, "Special Folders"
End Sub
20****、****GetTempName****方法
返回系統創建的一個臨時文件或文件夾名。其語法為:
oFileSysObj.GetTempName
其中,oFileSysObj代表任何能夠返回FileSystemObject對象的對象變量。
GetTempName方法不能創建臨時文件或文件夾,它僅僅提供一個可用于CreateTextFile方法的文件或文件夾名。
一般來說,不必創建自已的臨時文件名。Windows在Windows API中提供了一種算法來創建特殊的臨時文件或文件夾名,這樣Windows才能識別它們。GetTempName很好地包裝了GetTempFilename API函數。
21****、****CreateFolder****方法
CreateFolder方法用于在指定的路徑下創建一個新文件夾,并返回其Folder對象。其語法為:
oFileSysObj.CreateFolder (Path)
其中,oFileSysObj代表任何能夠返回FileSystemObject對象的對象變量。參數Path必需,為一個返回要創建的新文件夾名的表達式,String類型。Path指定的路徑可以是相對路徑也可以是絕對路徑,如果沒有指定路徑則使用當前驅動器和目錄作為路徑。在新的文件夾名中不能使用通配符。
如果參數Path指定的路徑為只讀,則CreateFolder方法將失敗;如果參數Path指定的文件夾已經存在,就會產生運行時錯誤“文件已經存在”。如果用戶有充分的權限,則參數Path可以指定為網絡路徑或共享名,例如:
CreateFolder "\NTSERV1\RootTest\newFolder"
在實際使用時,必須使用Set語句將Folder對象賦給對象變量,例如:
Dim oFileSys As New FileSystemObjectDim
oFolder As FolderSet oFolder=oFileSys.CreateFolder("MyFolder")
示例
Sub MakeNewFolder( )
Dim fs, objFolder
Set fs = CreateObject("Scripting.FileSystemObject")
Set objFolder = fs.CreateFolder("C:\TestFolder")
MsgBox "創建了一個名稱為" & objFolder.Name & "的文件夾."
End Sub
22****、****CopyFolder****方法
CopyFolder方法用于復制文件夾,即將一個文件夾的內容(包括其子文件夾)復制到其他位置。其語法為:
oFileSysObj.CopyFolder Source,Destination[,OverwriteFiles]
其中,參數oFileSysObj代表任何能夠返回FileSystemObject對象的對象變量。參數Source必需,指定要復制的文件夾的路徑和文件夾名,String類型,必須使用通配符或者非路徑分隔符來結束。參數Destination必需,指定文件夾復制操作的目標文件夾的路徑,String類型。參數OverwriteFiles可選,表示是否被覆蓋一個現有文件的標志,True表示覆蓋,False表示不覆蓋,Boolean類型。
通配符只能在參數Source中使用,但是只能放在最后的組件中。在參數Destination中不能使用通配符。
除非不允許使用通配符,否則就可以把源文件夾中的所有子文件夾和文件都復制到Destination指定的文件夾中,也就是說CopyFolder方法是遞歸的。
如果參數Destination以一個路徑分隔符結束或者參數Source以一個通配符結束,CopyFolder方法就認為參數Source中的指定的文件夾存在于參數Destination中,否則就創建這樣一個文件夾。例如,假設有如下的文件夾結構:
CopyFolder "C:\Rootone*","C:\RootTwo"
產生如下的文件夾結構:
CopyFolder "C:\Rootone","C:\RootTwo"
產生如下的文件夾結構:
如果參數Destination指定的目標路徑或任意文件被設置成只讀屬性,則不論OverwriteFiles的值如何,CopyFolder方法者將失效。
如果OverwriterFiles設置為False,而參數Source指定的源文件夾或任何文件存在于參數Destination中,將產生運行時錯誤“文件已經存在”。
如果在復制多個文件夾時出現錯誤,CopyFolder方法立即停止復制操作,不再復制余下要復制的文件。該方法不具有撤銷產生錯誤前文件復制操作的返回功能。
如果用戶有充分的權限,source或destination都可以是網絡路徑或共享名,例如:
CopyFolder "C:\Rootone","\NTSERV1\d$\RootTwo"
Sub MakeFolderCopy()
Dim fs As FileSystemObjec
Set fs = New FileSystemObject
If fs.FolderExists("C:\TestFolder") Then
fs.CopyFolder "C:\TestFolder", "C:\FinalFolder"
MsgBox "已復制該文件夾."
End If
End Sub
23****、****MoveFolder****方法
MoveFolder方法用來移動文件夾,將文件夾及其文件和子文件夾一起從某個位置移動到另一個位置。其語法為:
oFileSysObj.MoveFolder source,destination
其中,oFileSysObj代表任何能夠返回FileSystemObject對象的對象變量。參數Source指定要移動的文件夾的路徑,String類型。參數destination指定文件夾移動操作中目標位置的路徑,String類型。
Source必須以通配符或非路徑分隔符結束,可以使用通配符,但必須出現在最后一部分中。destination不能使用通配符。除非不允許使用通配符,否則源文件夾中所有的子文件夾和文件都被復制到destination指定的位置,也就是說MoveFolder方法是遞歸的。
如果destination用路徑分隔符結束或者source用通配符結束,MoveFolder就認為source中指定的文件夾存在于destination中。例如,假設有如下文件夾結構:
MoveFolder "C:\Rootone*","C:\RootTow"
產生如下文件夾結構:
MoveFolder "C:\Rootone","C:\RootTwo"
產生如下文件夾結構:
Source和destination可以為絕對路徑或相對路徑,可以為網絡路徑或共享名。
MoveFile方法在開始操作前先解析source和destination這兩個參數。
24****、****DeleteFolder****方法
DeleteFolder方法用于刪除指定的文件夾及其所有的文件和子文件夾。其語法為:
oFileSysObj.DeleteFolder FileSpec[,Force]
其中,oFileSysObj代表任何能夠返回FileSystemObject對象的對象變量。參數FileSpec必需,指定要刪除的文件夾的名稱和路徑,String類型。在參數FileSpec中,可以在路徑的最后部分包含通配符,但不能用路徑分隔符結束,可以為相對路徑或絕對路徑。
參數Force可選,Boolean類型,如果設置為True,將忽略文件的只讀標志并刪除這個文件。默認為False。如果參數Force設置為False并且文件夾中的任意一個文件為只讀,則該方法將失敗。如果找不到指定的文件夾,則該方法失敗。
如果指定的文件夾中有文件已經打開,則不能完成刪除操作,且產生一個“Permisson Denied”錯誤。DeleteFolder方法刪除指定文件夾中的所有內容,包括其他文件夾及其內容。
如果在刪除多個文件或文件夾時出現錯誤,DeleteFolder方法將立即停止刪除操作,即不能刪除余下的文件夾或文件。該方法不具有撤銷產生錯誤前文件夾刪除操作的返回功能。
DeleteFolder方法永久性刪除文件夾,并不把它們移到回收站中。
如果用戶有充分的權限,源路徑和目標路徑可以是網絡路徑或共享名,例如:
DeleteFolder "\RootTest"
示例
Sub RemoveFolder( )
Dim fs As FileSystemObject
Set fs = New FileSystemObject
If fs.FolderExists("C:\TestFolder") Then
fs.DeleteFolder "C:\TestFolder"
MsgBox "該文件夾已經被刪除."
End If
End Sub
25****、****OpenTextFile****方法
OpenTextFile方法用于打開(或創建)文本文件以進行讀取或寫入操作,返回一個TextStream對象。其語法為:
oFileSysObj.OpenTextFile (FileName[,IOMode[,Create[,Format]]])
其中,oFileSysObj代表任何能夠返回FileSystemObject對象的對象變量。參數FileName必需,指定要打開的文件的路徑和文件名,String類型,FileName的路徑部分可為相對路徑或絕對路徑。參數IOMode可選,指定文件打開模式的一個常數(參見前文的表格),默認設置為ForReading(1)。參數Create可選,一個Boolean型標志,說明如果在給定的路徑中找不到文件,是否應該創建該文件。參數Format可選,一個Tristate常數(參見前文的表格),指定打開文件的格式為ASCⅡ或Unicode格式,默認設置為ASCⅡ(False)。
如果另一個進程已經打開了指定文件,該方法將失敗,并產生一個“Permission Denied”錯誤。
要保證OpenTextFile方法成功執行,可以在調用它之前使用GetAbsolutePath和FileExists方法。
IOMode的值只能是一個常量值,例如,下面的方法調用:
lMode=ForReading or ForWritingoFileSys.OpenTextStream(strFileName,lMode) '錯誤
將產生運行時錯誤“無效的過程調用或參數”。
如果用戶有充分的權限,FileName的路徑部分可以是網絡路徑或共享名,例如:
OpenTextFile "\NTSERV1\d$\RootTwo\myFile.txt"
示例
Sub ReadTextFile( )
Dim fs As Object
Dim objFile As Object
Dim strContent As String
Dim strFileName As String strFileName = "C:\Windows\System.ini"
Set fs = CreateObject("Scripting.FileSystemObject")
Set objFile = fs.OpenTextFile(strFileName)
Do While Not objFile.AtEndOfStream
strContent = strContent & objFile.ReadLine & vbCrLf
Loop
objFile.Close
Set objFile = Nothing
ActiveWorkbook.Sheets(3).Select
Range("A1").Select Selection.Formula = strContent
End Sub
(二)****Drive****對象
上面已經提到Drive對象是用來獲取當前系統中各個驅動器的信息的。由于Drive對象沒有方法,其應用都是通過屬性表現出來的,所以我們必須熟悉Drive對象的屬性:
AvailableSpace:返回在指定的驅動器或網絡共享上的用戶可用的空間容量。
DriveLetter :返回某個指定本地驅動器或網絡驅動器的字母,這個屬性是只讀的。
DriveType:返回指定驅動器的磁盤類型。
FileSystem:返回指定驅動器使用的文件系統類型。
FreeSpace:返回指定驅動器上或共享驅動器可用的磁盤空間,這個屬性是只讀的。
IsReady:確定指定的驅動器是否準備好。
Path :返回指定文件、文件夾、或驅動器的路徑。
RootFolder :返回一個 Folder 對象,該對象表示一個指定驅動器的根文件夾。只讀屬性。
SerialNumber:返回用于唯一標識磁盤卷標的十進制序列號。
ShareName:返回指定驅動器的網絡共享名
TotalSize :以字節為單位,返回驅動器或網絡共享的總空間大小。
VolumeName :設置或返回指定驅動器的卷標名。
從上面的屬性可以看到Drive對象基本上包含了日常操作所需的全部的驅動器信息,因此在使用中是非常方便的。下面通過一個實例講述Drive對象的使用。首先在VB中建立一個工程,然后添加一個命令按鈕,將其Caption設置為“TestDrive”,然后在click事件中加入以下代碼:
Dim fsoTest As New FileSystemObject
Dim drv1 As Drive, sReturn As String
Set drv1 = fsoTest.GetDrive(“C:")
sReturn = “Drive " & “C:" & vbCrLf
sReturn = sReturn & “VolumeName" & drv1.VolumeName & vbCrLf
sReturn = sReturn & “Total Space: " & FormatNumber(drv1.TotalSize / 1024, 0)
sReturn = sReturn & “Kb" & vbCrLf
sReturn = sReturn & “Free Space: " & FormatNumber(drv1.FreeSpace / 1024, 0)
sReturn = sReturn &“Kb" & vbCrLf
sReturn = sReturn &“FileSystem:" & drv1.FileSystem & vbCrLf
MsgBox sReturn
其中GetDrive方法返回一個與指定路徑中的驅動器相對應的 Drive 對象。該方法的語法格式為object.GetDrive drivespec,object是一個FSO對象的名稱,drivespec用于指定驅動器的名稱。
按F5運行上述代碼,按下TestDrive按鈕就會彈出一個消息框顯示C盤的信息。
(三)****Folder****對象
在FSO 對象模型中,提供了豐富的有關文件夾操作的方法,這些方法分別是:
? FileSystemObject對象中有關文件夾的方法:
CreateFolder :創建一個文件夾。
DeleteFolder:刪除一個文件夾。
MoveFolder :移動一個文件夾。
CopyFolder:復制一個文件夾。
FolderExists:查找一個文件夾是否在驅動器上。
GetFolder :獲得已有Folder對象的一個實例。
GetParentFolderName:找出一個文件夾的父文件夾的名稱。
GetSpecialFolder:找出系統文件夾的路徑。
? Folder對象的方法:
Delete :創建一個文件夾。
Move :移動一個文件夾。
Copy:復制一個文件夾。
Name:檢索文件夾的名稱。
在此需要強調一點,前面我們曾經提到過FSO對象模型包含的方法是冗余的,所以Folder對象的Delete、Move、Copy方法和FileSystemObject對象的DeleteFolder、MoveFolder、CopyFolder方法實際上是相同的,因此在實際使用中可以任選其中的一種。
和Drive對象一樣,下面通過實例演示Folder對象的應用。在VB下新建一個工程,然后在上面添加三個命令按鈕,然后在Form1的通用部分加入以下代碼:
Option Explicit
Dim fsoTest As New FileSystemObject
Dim folder1 As Folder
并且分別在三個命令按鈕的click事件輸入以下代碼:
Private Sub CmdCreate_Click()
Set folder1 = fsoTest.GetFolder(“C:") ' 獲取 Folder 對象。
fsoTest.CreateFolder (“C:\Test") '創建文件夾
MsgBox “folder C:\Test has created"
End Sub
Private Sub CmdDelete_Click()
Set folder1 = fsoTest.GetFolder(“C:") ' 獲取 Drive 對象。
fsoTest.DeleteFolder (“C:\Test") '刪除文件夾
MsgBox“folder C:\Test has deleted"
End Sub
Private Sub CmdGetPro_Click()
'獲取文件夾的有關信息
Dim sReturn As String
Set folder1 = fsoTest.GetFolder(“C:\Windows")
sReturn = “The folder's Attributes is " & folder1.Attributes & vbCrLf
'獲取最近一次訪問的時間
sReturn = sReturn & “The folder's last access time is " & folder1.DateLastAccessed & vbCrLf
'獲取最后一次修改的時間
sReturn = sReturn & “The folder's last modify time is " & folder1.DateLastModified & vbCrLf
'獲取文件夾的大小
sReturn = sReturn & “The folder's size is " & FormatNumber(folder1.Size / 1024, 0)
sReturn = sReturn & “Kb" & vbCrLf
'判斷文件或文件夾類型
sReturn = sReturn & “The type is " & folder1.Type & vbCrLf
MsgBox sReturn
End Sub
上述代碼中提到的CreateFolder方法的語法形式為object.CreateFolder(foldername)。foldername指定了要創建的文件夾的名稱,而DeleteFolder方法的語法形式為object.DeleteFolder folderspec[,force],其中,folderspec用來指定要刪除的文件夾的名稱,force是一個可選的布爾型參數,如果希望刪除只讀屬性的文件夾則將該值設為TRUE,默認為FALSE。
(四)****File****對象和****TextStream****對象
由于有關File對象的復制,刪除,移動等操作和Folder對象類似,所以這部分內容就不再重復。這里主要講述利用File對象和TextStream對象操作文本文件。
通常對文本文件的操作包括在文本文件中創建數據,在文本文件中添加數據,刪除文本文件的數據等操作。這些操作都可以通過File對象和FileSystemObject對象的相關方法完成。不過在使用之前,首先要創建一個文本文件,這可以通過三種方法完成。一種方法是使用FileSystemObject對象的 CreateTextFile 方法。要創建一個空文本文件,可以用以下語句:
Dim fsoTest As New FileSystemObject, fil1 As File
Set fil 1= fsoTest.CreateTextFile(“c:\testfile.txt", True)
第二種方法是使用 FileSystemObject 對象帶 ForWriting 標志設置的 OpenTextFile 方法,
Dim fsoTest As New FileSystemObject, ts1 As New TextStream
Set ts1 = fsoTest.OpenTextFile(“c:\testfile.txt", ForWriting)
第三種方法是使用File對象的帶 ForWriting 標志設置的 OpenAsTextStream 方法:
Dim fsoTest As
--------------------------------------------
補:
[VBA]如何判斷一個文件或者文件夾是否存在,可以使用如下幾個函數來判斷
|
Function ExistsFile_UseFso(strPath As String) As Boolean
Dim fso
Set fso = CreateObject("Scripting.FileSystemObject")
ExistsFile_UseFso = fso.FileExists(strPath)
Set fso = Nothing
End Function
|
|
PS: fso.FileExists(strPath),這個直接有返回值的。1和0
|