5.4.1 FileSystemObject對象成員概要
FileSystemObject對象提供一個屬性和一系列方法,可用它們來操縱FileSystemObject對象實現的一些從屬對象。這裡提供了全部的內容概要,然後介紹每一個從屬對象。
1. FileSystemObject的屬性
FileSystemObject對象只有一個屬性,它用於得到當前機器上的所有有效驅動器的列表,如表5-4所示:
表5-4 FileSystemObject對象的屬性及說明
屬 性
說 明
Drivers
返回本地計算機可用的驅動器列表。
2. FileSystemObject的方法
FileSystemObject對象提供了使用從屬對象的一系列方法,從屬對象包括Drive、Folder和File等對象。它也實現了用於TextStream對象的兩個方法:CreateTextFile和OpenTextFile。根據所使用的對象的類型,將方法劃分為三類。
(1) 與驅動器有關的方法
與驅動器有關的方法如表5-5所示:
表5-5 與驅動器有關的方法及說明
方 法
說 明
DriveExists(drivespec)
如果在drivespec中指定的驅動器存在,則返回True,否則返回False。drivespec參數可以是一個驅動器字母,或者是文件、文件夾的完整絕對路徑
GetDrive(drivespec)
返回drivespec指定的驅動器所對應的Drive對象。drivespec可以包含冒號、路徑分隔符或者是網絡共享名,即:“C”、“C:”、“C:\”及“\\Machine\sharename”
GetDriveName(drivespec)
用字符串返回drivespec指定的驅動器的名稱。drivespec參數必須是文件或文件夾的絕對路徑,或者僅僅是驅動器字母,例如:“c:”或“c”
(2) 與文件夾有關的方法
與文件夾有關的方法如表5-6所示:
表5-6 與文件夾有關的方法及說明
方 法
說 明
BuildPath(path,name)
在已有的路徑path上增添名字為name的文件或文件夾,如果需要,則增添路徑分隔符’\’
CopyFolder(source,destination,overwrite)
從指定的源文件夾source(可以包含通配符)中復制一個或多個文件夾到指定的目標文件夾destination,包含了源文件夾中的所有文件。如果source包含通配符或destination末尾是路徑分隔符(‘\’),那麼認為destination是要放置源文件夾的拷貝的文件夾。否則的話,認為destination是要創建的新文件夾的路徑名。如果destination文件夾已經存在且overwrite參數設置為False,將產生錯誤,缺省的overwrite參數是True
CreateFolder(foldername)
創建一個路徑名為foldername的文件夾。如果foldername已經存在將產生錯誤
DeleteFolder(folderspec,force)
刪除由folderspec指定的一個或多個文件夾(可以在路徑的最後部分包含通過配符)及文件夾中的所有內容。如果可選的force參數設置為true,那麼即使文件夾包含的文件具有只讀屬性,也將刪除該文件夾。缺省的force參數是False
FolderExist(folderspec)
如果folderspec指定的文件夾存在則返回True,否則返回False。folderspec參數可以包含文件夾的絕對或相對路徑,或者僅僅是當前文件夾中看到的文件夾名
GetAbsolutePathName(pathspec)
返回明確指定文件夾的路徑,其中要考慮到當前文件夾的路徑。例如,如果當前文件夾是“c:\docs\sales\”,而pathspec是“jan”,返回的字符是“c:\docs\sales\jan”。通配符、”..”和”\\”路徑操作符都是可以接受的
GetFolder(folderspec)
返回folderspec指定的文件夾對應的Folder對象。folderspec可以是文件夾的相對的或絕對的路徑
GetParentFolderName(pathspec)
返回pathspec文件或文件夾的上一級文件夾。不檢驗該文件夾是否存在
GetSpecialfolder(folderspec)
返回一個特定的Windows文件夾相對應的Folder對象。參數folderspec的允許值是WindowsFolder(0)、SystemFolder(1)和TemporaryFolder(2)
MoveFolder(source,destination)
將source指定的一個或多個文件夾移動到destination指定的文件夾。在source裡可以包含通配符,但在destination中不行。如果source包含通配符或destination末尾是路徑分隔符(‘\’),則認為destination是要放置源文件夾的文件夾,否則認為它是一個新文件夾的完整路徑和名字。如果目的文件夾destination已經存在則產生錯誤
(3) 與文件有關的方法
與文件有關的方法如表5-7所示:
方 法
說 明
CopyFile(source,destination,
overwrite)
將source(可包含通配符)指定的一個或多個文件復制到指定的目標文件夾destination。如果source包含通配符或destination末尾是路徑分隔符(‘\’),那麼認為destination是文件夾。否則認為destination為一新文件的完全路徑和名稱。如果目標文件夾已經存在且overwrite參數設置為False,將產生錯誤。缺省的overwrite參數是True
CreateTextFile(filename,overwrite,
unicode)
用指定的文件名filename在磁盤上創建一個新的文本文件,並返回與其對應的TextStream對象,如果可選的overwrite參數設置為True,則覆蓋同一路徑下已有的同名文件。缺省的overwrite參數是False。如果可選的unicode參數設置為True,則該文件的內容將存儲為Unicode文本,缺省的unicode參數是False
DeleFile(filespec,force)
刪除由filespec指定的一個或多個文件(可以在路徑的最後部分包含通配符)。如果可選的force參數設置為true,那麼也刪除具有只讀屬性的文件。缺省的force參數是False
FileExists(filespec)
如果filespec指定的文件存在則返回True,否則返回False。filespec參數可以包含文件的絕對路徑或相對路徑,或者是當前文件夾中的文件名
GetBaseName(filespec)
返回filespec指定的文件的名稱,即包含文件路徑但去掉了文件的擴展名
GetExtensionName(filespec)
返回filespec指定的文件的擴展名
GetFile(filespec)
返回filespec指定的文件所對應的File對象。可以指定文件的相對或絕對路徑
GetFileName(pathspec)
返回pathspec指定的文件的路徑或文件名,如果沒有文件名就返回最後的文件夾名。不檢查該文件或文件夾是否存在
GetTempName()
返回一個隨機產生的文件名,用於完成運算所需的臨時文件或文件夾
MoveFile(source,destination)
將source指定的一個或多個源文件移動到destination指定的目的文件夾。在source裡可以包含通配符,但destination不行。如果source包含通過配符或destination末尾是路徑分隔符(‘\’),那麼認為destination是一文件夾。否則,認為destination是一新文件夾的完整路徑和名稱。如果目的文件夾已經存在則產生錯誤
OpenTextFile(filename,iomode,create,
format)
創建一個名叫做filename的文件,或打開一個現有的名為filename的文件,並且返回一個與其相關的TextStream對象。filename參數可以包含絕對或相對路徑。iomode參數指定了所要求的訪問類型。允許的數值是ForReading(1)(缺省)、ForWriting(2)、ForAppending(8)。當寫入或追加到一個不存在的文件時,如果create參數設置為true,就將創建一個新文件。缺省的create參數是False。format參數說明對文件讀或寫的數據格式。允許數值是:TristatetFalse(0)(缺省),按照ASCII格式打開;TristatetTrue(-1),按照Unicode格式打開;TristateDefault(-2),用系統缺省格式打開
Unicode文件使用兩個字節標識每個字符,取消了ASCII字符最多256個的限制。
5.4.2 使用驅動器
下面是使用FileSystemObject對象的簡單例子,它使用DriveExists方法得到現有的驅動器字母的列表:
‘ In VBScript
Set objfso = Server.CreateObject(“Scripting.FileSystemObject”)
For intCode = 65 To 90 ‘ANSI codes for ‘A’ to ‘Z’
strLetter = Chr(intCode)
If objFSO.DriveExists(strLetter) Then
Response.Write “Found drive “ & strLetter & “:<BR>”
End If
Next
或用JScript:
// In JScript
var objFSO = Server.CreateObject(‘Scripting.FileSystemObject’);
for (var intCode = 65; intCode <= 90; intCode++) { //ANSI codes for ‘A’ to ‘Z’
strLetter = String.formCharCode(intCode);
If (objFSO.DriveExists(strLetter))
Response.Write (‘Found drive ‘ + strLetter + “:<BR>”);
}
這兩個程序段的運行結果是相同的,如圖5-9所示:
圖5-9 驅動器列表
這一頁面為driveexists_vb.ASP,由本書的示例文件提供。
1. Drive對象
正如已經看到的,FileSystemObject對象包含一個屬性——Drives,它返回一個包括本地計算機上所有可用驅動器的集合。
Drives集合裡的每個條目是一個Drive對象。Drive對象的屬性如表5-8所示:
表5-8 Drive對象的屬性及說明
屬 性
說 明
AvailableSpave
考慮了帳戶定額和/或其他限制,返回驅動器上對於該用戶可用的空間的大小
DriveLetter
返回驅動器的字母
DriveType
返回驅動器的類型。返回值可以是Unknown(0)、Removeable(1)、Fixed(2)、Network(3)、CDRom(4)和RamDisk(5)。然而需要注意的是當前版本的scrrun.dll不支持預定義常數Network,必須使用十進制3來代替
FileSystem
返回驅動器文件系統的類型。返回值包括“FAT”、“NTFS”和“CDFS”
FreeSpace
返回驅動器上可用剩余空間的總量
IsReady
返回一個布爾值表明驅動器是否已准備好
Path
返回一個由驅動器字母和冒號組成的驅動器路徑,即“C:”
RootFolder
返回代表的驅動器根目錄文件夾的Folder對象
SerialNumber
返回一個用於識別磁盤卷的十進制的序列號
ShareName
如果是一個網絡驅動器,返回該驅動器的網絡共享名
TotalSize
返回驅動器的總容量(以字節為單位)
VolumeName
設定或返回本地驅動器卷名
因此,通過使用Drives集合裡的Drive對象,可以在服務器上產生一個驅動器列表,與通過檢查每個可能的驅動器字母來判別驅動器是否存在的方法相比,效率更高。我們也可以得到關於該驅動器的信息。在VBScript裡,代碼如下:
' In VBScript:
' create a FileSystemObject instance
Set objFSO = Server.CreateObject("Scripting.FileSystemObject")
' create a Drives collection
Set colDrives = objFSO.Drives
' iterate through the Drives collection
For Each objDrive in colDrives
Response.Write "DriveLetter: <B>" & objDrive.DriveLetter & "</B> "
Response.Write "DriveType: <B>" & objDrive.DriveType
Select Case objDrive.DriveType
Case 0: Response.Write " - (Unknown)"
Case 1: Response.Write " - (Removable)"
Case 2: Response.Write " - (Fixed)"
Case 3: Response.Write " - (Network)"
Case 4: Response.Write " - (CDRom)"
Case 5: Response.Write " - (RamDisk)"
End Select
Response.Write "</B> "
If objDrive.DriveType = 3 Then
If objDrive.IsReady Then
Response.Write "Remote drive with ShareName: <B>" & objDrive.ShareName & "</B>"
Else
Response.Write "Remote drive - <B>IsReady</B> PRoperty returned_
<B>False</B><BR>"
End If
Else If objDrive.IsReady then
Response.Write "FileSystem: <B>" & objDrive.FileSystem & "</B> "
Response.Write "SerialNumber: <B>" & objDrive.SerialNumber & "</B><BR>"
Response.Write "Local drive with VolumeName: <B>" & _
objDrive.VolumeName & "</B><BR>"
Response.Write "AvailableSpace: <B>" & FormatNumber( _
objDrive.AvailableSpace / 1024, 0) & "</B> KB "
Response.Write "FreeSpace: <B>" & FormatNumber( _
objDrive.FreeSpace / 1024, 0) & "</B> KB "
Response.Write "TotalSize: <B>" & FormatNumber(_
objDrive.TotalSize / 1024, 0) & "</B> KB"
End if
Response.Write "<P>"
End if
Next
注意,不能用預定義常數Network比較驅動器的DriveType屬性,因為(至少在scrrun.dll的當前版本中)在類型庫中省略了Network常數,因此不再作為公用的常數使用。
在JScript中,該程序是:
// In JScript:
// create a FileSystemObject instance
var objFSO = Server.CreateObject('Scripting.FileSystemObject');
// create a Drives collection
var colDrives = new Enumerator(objFSO.Drives);
for (; !colDrives.atEnd(); colDrives.moveNext()) {
objDrive = colDrives.item();
Response.Write('DriveLetter: ' + objDrive.DriveLetter + '<BR>');
Response.Write('DriveType: ' + objDrive.DriveType + '<BR>');
if (objDrive.DriveType == 3)
if (objDrive.IsReady)
Response.Write('Remote drive with ShareName: ' +
objDrive.ShareName + '<BR>')
else
Response.Write('Remote drive - IsReady property returned False<BR><BR>');
else if (objDrive.IsReady) {
Response.Write('Local drive with VolumeName: ' +
objDrive.VolumeName + '<BR>');
Response.Write('FileSystem: ' + objDrive.FileSystem + '<BR>');
Response.Write('SerialNumber: ' + objDrive.SerialNumber + '<BR>');
Response.Write('AvailableSpace: ' + objDrive.AvailableSpace + ' bytes<BR>');
Response.Write('FreeSpace: ' + objDrive.FreeSpace + ' bytes<BR>');
Response.Write('TotalSize: ' + objDrive.TotalSize + ' bytes<P>');
}
}
在系統上運行這段程序以前有一點要注意。如果在A驅動器裡沒有磁盤,或CD-ROM驅動器裡沒有光盤,將得到一個錯誤提示:“Disk Not Ready”。除了DriveLetter屬性和DriveType屬性外,在使用其他屬性和方法前,通過檢查每個驅動器的IsReady屬性,可以保護該頁面。
當在服務器上運行以上VBScript代碼時,運行結果如圖5-10所示。這一頁面為drivescollection_vb.ASP,來自本書提供的示例文件。
圖5-10 驅動器詳細列表
2. 文件系統定位
FileSystemObject的幾個方法可用於得到其他對象的引用,因此可以在服務器的文件系統和任何網絡驅動器中定位。事實上,在ASP代碼裡使用的所有對象或組件中,除了ActiveX Data Object組件,FileSystemObject對象很可能是最復雜的對象之一。
這種復雜性是由於對如何訪問文件系統的不同部分,要求有極高的靈活性。例如,可以從FileSystemObject向下通過使用各種從屬對象定位一個文件。其過程是從Drives集合開始,到一個Drive對象,再到驅動器的根Folder對象,然後到子Folder對象,再到文件夾的Files集合,最後到集合內的File對象。
另外,如果已知要訪問的驅動器、文件夾或文件。可以直接對其使用GetDrive、GetFolder、GetSpecialFolder和GetFile方法。圖5-11有助於理解所有文件系統定位相關的組件、對象、方法和屬性之間的關系。
圖5-11 文件系統定位關系