談Scripting.FileSystemObject對象
FileSystemObject對象提供對計算機文件系統的訪問,它允許我們在代碼內操作文本文件、文件夾及驅動器。它是腳本運行期庫提供的對象之一,對于服務器ASP頁面內的VBScript和JScript都有效。如果頁面的擴展名為.hta(表示它們是HTA的一部分),它也可用在客戶端的IE 5中。本節僅討論在服務器上的ASP腳本如何使用FileSystemObject對象。
       超級文本應用程序(HTA)由指定的“受信任的”頁面組成,在頁面的<HEAD>段里包含<HTA: APPLICATION>元素。例如:
    <HTA:APPLICATION ID=”objMyApp” APPLICATIONNAME=”myApp”>
這些頁面可以使用客戶端腳本引擎中的一些不常用特性,這些特性中有FileSystemObject對象和TextStream對象。關于超級文本應用程序的更多信息,請訪問Microsoft Workshop網站。
可以使用下面的程序創建一個FileSystemObject對象實例:
‘ In VBScript:
Dim objMyFSO
Set objMyFSO = Server.CreateObject(“Scripting.FileSystemObject”)

// In JScript:
var objMyFSO = Server.CreateObject(‘Scripting.FileSystemObject’);

<!-- Server-side with an OBJECT element -->
<OBJECT RUNAT=”SERVER” SCOPE=”PAGE” ID=”objFSO”
              PROGID=”Scripting.FileSystemObject”>
</OBJECT>
在ASP頁面里,增加一個對于FileSystemObject類型庫的引用是非常有用的。這允許使用它直接定義的內置常數,不用像過去那樣用數字等效表達式代替。整個腳本運行期庫的類型庫可以增加到任何ASP頁面中,代碼如下:
<!-- METADATA TYPE=”typelib” FILE=”C:WinNTSystem32scrrun.dll” -->如果你是在另一個目錄下安裝Windows,必須編輯FILE的屬性值。
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:”及“\machinesharename”

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:docssales”,而pathspec是“jan”,返回的字符是“cocssalesjan”。通配符、”..”和”\”路徑操作符都是可以接受的

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所示:


       這一頁面為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,來自本書提供的示例文件。

2.  文件系統定位
FileSystemObject的幾個方法可用于得到其他對象的引用,因此可以在服務器的文件系統和任何網絡驅動器中定位。事實上,在ASP代碼里使用的所有對象或組件中,除了ActiveX Data Object組件,FileSystemObject對象很可能是最復雜的對象之一。
這種復雜性是由于對如何訪問文件系統的不同部分,要求有極高的靈活性。例如,可以從FileSystemObject向下通過使用各種從屬對象定位一個文件。其過程是從Drives集合開始,到一個Drive對象,再到驅動器的根Folder對象,然后到子Folder對象,再到文件夾的Files集合,最后到集合內的File對象。
另外,如果已知要訪問的驅動器、文件夾或文件。可以直接對其使用GetDrive、GetFolder、GetSpecialFolder和GetFile方法。圖5-11有助于理解所有文件系統定位相關的組件、對象、方法和屬性之間的關系。

1.  Folder對象
Driver對象的RootFolder屬性返回一個Folder對象,通過該對象可訪問這個驅動器內的所有的內容。可以使用這個Folder對象的屬性和方法遍歷驅動器上的目錄,并得到該文件夾和其他文件夾的屬性。
(1)    Folder對象的屬性
Folder對象提供一組屬性,可用這些屬性得到關于當前文件夾的更多信息,也可以改變該文件夾的名稱。其屬性及說明如表5-9所示:
表5-9  Folder 對象的屬性及說明
屬 性
說 明

Attributes
返回文件夾的屬性。可以是下列值中的一個或其組合:Normal(0)、ReadOnly(1)、Hidden(2)、System(4)、Volume(名稱)(8)、Directory(文件夾)(16)、Archive(32)、Alias(64)和Compressed(128)。例如,一個隱藏的只讀文件,Attributes的值為3

DateCreated
返回該文件夾的創建日期和時間

DateLastAccessed
返回最后一次訪問該文件夾的日期和時間

DateLastModified
返回最后一次修改該文件夾的日期和時間

Drive
返回該文件夾所在的驅動器的驅動器字母

Files
返回Folder對象包含的Files集合,表示該文件夾內所有的文件

IsRootFolder
返回一個布爾值說明該文件夾是否是當前驅動器的根文件夾

Name
設定或返回文件夾的名字

ParentFolder
返回該文件夾的父文件夾對應的Folder對象

Path
返回文件夾的絕對路徑,使用相應的長文件名

ShortName
返回DOS風格的8.3形式的文件夾名

ShortPath
返回DOS風格的8.3形式的文件夾的絕對路徑

Size
返回包含在該文件夾里所有文件和子文件夾的大小

SubFolers
返回該文件夾內包含的所有子文件夾對應的Folders集合,包括隱藏文件夾和系統文件夾

Type
如果可能,返回一個文件夾的說明字符串(例如,“Recycle Bin”)
(2)    Folder對象的方法
Folder對象提供一組可用于復制、刪除和移動當前文件夾的方法。這些方法的運行方式與FileSystemObject對象的CopyFolder、DeleFolder和MoveFolder方法相同,但這些方法不要求source參數,因為源文件就是這個文件夾。這些方法及說明如表5-10所示:
表5-10  Folder對象的方法及說明
方 法
說 明

Copy(destination,overwrite)
將這個文件夾及所有的內容復制到destination指定的文件夾。如果destination的末尾是路徑分隔符(‘’),那么認為destination是放置拷貝文件夾的一個文件夾。否則認為destination是要創建的新文件夾的路徑和名字。如果目標文件夾已經存在且overwrite參數設置為False,將產生錯誤,缺省的overwrite參數是True

Delete(force)
刪除文件夾及里面的所有內容。如果可選的force參數設置為True,即使文件夾設置為只讀或含有只讀的文件,也將刪除該文件夾。缺省的force是False

Move(destination)
將文件夾及里面所有的內容移動到destination指定的文件夾。如果destination的末尾是路徑分隔符(‘’),那么認為destination是放置移動文件夾的一個文件夾。否則認為destination是一個新的文件夾的路徑和名字。如果目標文件夾已經存在,則出錯

CreateTextFile
(filename,overwrite,unicode)
用指定的文件名在文件夾內創建一個新的文本文件,并且返回一個相應的TextStream對象。如果可選的overwrite參數設置為True,將覆蓋任何已有的同名文件。缺省的overwrite參數是False。如果可選的unicode參數設置為True,文件的內容將存儲為unicode文本。缺省的unicode是False

       在文件夾之間可以使用當前文件夾的ParentFolder屬性,返回到父目錄。當到達一個文件夾時,如果IsRootFolder屬性是True,就停下來。離開驅動器的根目錄,沿目錄樹向下,可遍歷或訪問在Folders集合(由當前文件夾的SubFolders屬性返回)內的指定文件夾。
       下列程序遍歷了驅動器C根目錄內的所有文件夾,并顯示各個文件夾的有關信息。
       VBScript程序如下:
       'In VBScript:
' Create a FileSystemObject instance
Set objFSO = Server.CreateObject("Scripting.FileSystemObject")
' Get a reference to drive C
Set objDriveC = objFSO.GetDrive("C:")
' Get a reference to the root folder
Set objRoot = objDriveC.RootFolder
' Get a reference to the SubFolders collection
Set objFolders = objRoot.SubFolders
' Get a reference to the first folder in the SubFolders collection
For Each objFolder In objFolders
  Set objFolder1 = objFolders.Item((objFolder.Name))
  Exit For
Next
' Iterate through all the files in this folder
For Each objFile in objFolder1.Files
  Response.Write "Name: " & objFile.Name & "   "
  Response.Write "ShortName: " & objFile.ShortName & "   "
  Response.Write "Size: " & objFile.Size & " bytes    "
  Response.Write "Type: " & objFile.Type & "<BR>"
  Response.Write "Path: " & objFile.Path & "   "
  Response.Write "ShortPath: " & objFile.ShortPath & "<BR>"
  Response.Write "Created: " & objFile.DateCreated & "   "
  Response.Write "LastModified: " & objFile.DateLastModified & "<P>"
Next
JScript程序如下:
//In JScript:
// Create a FileSystemObject instance
var objFSO = Server.CreateObject('Scripting.FileSystemObject');
// Get a reference to drive C
var objDriveC = objFSO.GetDrive('C:');
// Get a reference to the root folder
var objRoot = objDriveC.RootFolder;
// Get a reference to the first folder in the SubFolders collection
var colAllFolders = new Enumerator(objRoot.SubFolders);
var objFolder1 = colAllFolders.item();
// Get a reference to the Files collection for this folder
var colFiles = new Enumerator(objFolder1.Files);

// Iterate through all the files in this collection
for (; !colFiles.atEnd(); colFiles.moveNext()) {
  objFile = colFiles.item()
  Response.Write('Name: ' + objFile.Name + '   ');
  Response.Write('ShortName: ' + objFile.ShortName + '   ');
  Response.Write('Size: ' + objFile.Size + ' bytes    ');
  Response.Write('Type: ' + objFile.Type + '<BR>');
  Response.Write('Path: ' + objFile.Path + '   ');
  Response.Write('ShortPath: ' + objFile.ShortPath + '<BR>');
  Response.Write('Created: ' + objFile.DateCreated + '   ');
  Response.Write('Accessed: ' + objFile.DateLastAccessed + '   ');
  Response.Write('Modified: ' + objFile.DateLastModified + '<P>');
}
該VBScript程序在服務器上運行時的結果如圖5-12所示。該頁面為folderscollection_vb.asp,來自本書提供的示例文件。

(3)    使用特殊文件夾
GetSpecialFolder是FileSystemObject對象的方法之一,它返回計算機上三個“特殊文件夾”對應的Folder對象:
· WindowsFolder:%Windows%目錄,缺省為WinNT(或Windows,在非NT/2000計算機上)目錄。
· SystemFolder:%System%目錄,缺省為WinNTSystem32(或WindowsSystem,在非NT/2000計算機上)目錄。
· TemporaryFolder:%Temp%目錄,缺省為WinNTTemp(或WindowsTemp,在非NT/2000計算機上)目錄。
為得到對特殊文件夾的引用,我們提供相應的預定義常數作為GetSpecialFolder方法的參數:
' In VBScript:
Set objFSO = Server.CreateObject("Scripting.FileSystemObject")

Set objFolder = objFSO.GetSpecialFolder(WindowsFolder)
Response.Write "GetSpecialFolder(WindowsFolder) returned:<BR>"
Response.Write "Path: " & objFolder.Path & "<BR>"
Response.Write "Type: " & objFolder.Type & "<P>"

Set objFolder = objFSO.GetSpecialFolder(SystemFolder)
Response.Write "GetSpecialFolder(SystemFolder) returned:<BR>"
Response.Write "Path: " & objFolder.Path & "<BR>"
Response.Write "Type: " & objFolder.Type & "<P>"

Set objFolder = objFSO.GetSpecialFolder(TemporaryFolder)
Response.Write "GetSpecialFolder(TemporaryFolder) returned:<BR>"
Response.Write "Path: " & objFolder.Path & "<BR>"
Response.Write "Type: " & objFolder.Type & "<P>"
或用JScript:
// In JScript:
var objFSO = Server.CreateObject('Scripting.FileSystemObject');

var objFolder = objFSO.GetSpecialFolder(WindowsFolder);
Response.Write('GetSpecialFolder(WindowsFolder) returned -  ');
Response.Write('Path: ' + objFolder.Path + '   ');
Response.Write('Type: ' + objFolder.Type + '<BR>');

var objFolder = objFSO.GetSpecialFolder(SystemFolder);
Response.Write('GetSpecialFolder(SystemFolder) returned -  ');
Response.Write('Path: ' + objFolder.Path + '   ');
Response.Write('Type: ' + objFolder.Type + '<BR>');

var objFolder = objFSO.GetSpecialFolder(TemporaryFolder);
Response.Write('GetSpecialFolder(TemporaryFolder) returned -  ');
Response.Write('Path: ' + objFolder.Path + '   ');
Response.Write('Type: ' + objFolder.Type + '<BR>');
該VBScript程序在服務器上運行時的結果如圖5-13所示。該頁面名為specialfolder_vb.asp,來自本書提供的示例文件。

2.  File對象
File對象提供了對文件的屬性的訪問,通過它的方法能夠對文件進行操作。每個Folder對象提供了一個Files集合,包含文件夾中文件對應的File對象。還可以直接地從FileSystemObject對象中通過使用GetFile方法得到一個File對象引用。
(1)      File對象的屬性
File對象有一系列的屬性,類似于Folder對象的屬性,如表5-11所示:
表5-11  File對象的屬性及說明
屬 性
說 明

Attributes
返回文件的屬性。可以是下列值中的一個或其組合:Normal(0)、ReadOnly(1)、Hidden(2)、System(4)、Volume(名稱)(9)、Directory(文件夾)(16)、Archive(32)、Alias(64)和Compressed(128)

DateCreated
返回該文件夾的創建日期和時間

DateLastAccessed
返回最后一次訪問該文件的日期和時間

DateLastModified
返回最后一次修改該文件的日期和時間

Drive
返回該文件所在的驅動器的Drive對象

Name
設定或返回文件的名字

ParentFolder
返回該文件的父文件夾的Folder對象

Path
返回文件的絕對路徑,可使用長文件名

ShortName
返回DOS風格的8.3形式的文件名

ShortPath
返回DOS風格的8.3形式的文件絕對路徑

Size
返回該文件的大小(字節)

Type
如果可能,返回一個文件類型的說明字符串(例如:“Text Document”表示.txt文件)

       (2)  File對象的方法
       同樣類似于Folder對象,File對象的方法允許復制、刪除以及移動文件。它也有一個使用文本流打開文件的方法。File對象的方法及說明如表5-12所示:
表5-12  File對象的方法及說明
方 法
說 明

Copy(destination,overwrite)
將這個文件復制到destination指定的文件夾。如果destination的末尾是路徑分隔符(‘’),那么認為destination是放置拷貝文件的文件夾。否則認為destination是要創建的新文件的路徑和名字。如果目標文件已經存在且overwrite參數設置為False,將產生錯誤,缺省的overwrite參數是True

Delete(force)
刪除這個文件。如果可選的force參數設置為True,即使文件具有只讀屬性也會被刪除。缺省的force是False

Move(destination)
將文件移動到destination指定的文件夾。如果destination的末尾是路徑分隔符(‘’),那么認為destination是一文件夾。否則認為destination是一個新的文件的路徑和名字。如果目標文件夾已經存在,則出錯

CreateTextFile
(filename,overwrite,unicode)
用指定的文件名創建一個新的文本文件,并且返回一個相應的TextStream對象。如果可選的overwrite參數設置為True,將覆蓋任何已有的同名文件。缺省的overwrite參數是False。如果可選的unicode參數設置為True,文件的內容將存儲為unicode文本。缺省的unicode是False
OpenAsTextStream
(iomode,format)
打開指定文件并且返回一個TextStream對象,用于文件的讀、寫或追加。iomode參數指定了要求的訪問類型,允許值是ForReading(1) (缺省值)、ForWrite(2)、ForAppending(8)。format參數說明了讀、寫文件的數據格式。允許值是TristateFalse(0)(缺省),說明用ASCII數據格式;TristateTrue(-1)說明用Unicode數據格式;TristateUseDefault(-2)說明使用系統缺省格式

       因此給定一個File對象后,可以使用ParentFolder屬性得到包含該文件的Folder對象的引用,用來在文件系統中導航。甚至可以用Drive屬性獲得相應的Drive對象的引用,并得到各種Folder對象以及所包含的File對象。
       另外,給定一個Folder對象以及對應的Files集合后,可以通過遍歷該集合檢查這一文件夾中的每個文件。還可以使用File對象的各種方法以一定方式處理該文件,如復制、移動或刪除。下面的代碼給出了C驅動器的第一個文件夾的文件列表:
       ' In VBScript:
' Create a FileSystemObject instance
Set objFSO = Server.CreateObject("Scripting.FileSystemObject")
' Get a reference to drive C
Set objDriveC = objFSO.GetDrive("C:")
' Get a reference to the root folder
Set objRoot = objDriveC.RootFolder
' Get a reference to the SubFolders collection
Set objFolders = objRoot.SubFolders
' Get a reference to the first folder in the SubFolders collection
For Each objFolder In objFolders
  Set objFolder1 = objFolders.Item((objFolder.Name))
  Exit For
Next
' Iterate through all the files in this folder
For Each objFile in objFolder1.Files
  Response.Write "Name: " & objFile.Name & "   "
  Response.Write "ShortName: " & objFile.ShortName & "   "
  Response.Write "Size: " & objFile.Size & " bytes    "
  Response.Write "Type: " & objFile.Type & "<BR>"
  Response.Write "Path: " & objFile.Path & "   "
  Response.Write "ShortPath: " & objFile.ShortPath & "<BR>"
  Response.Write "Created: " & objFile.DateCreated & "   "
  Response.Write "LastModified: " & objFile.DateLastModified & "<P>"
Next
注意,不能使用數字索引來定位Folders或Files集合里的條目,因此必須使用For Each … Next語句遍歷該集合直到最初的條目,然后使用該條目的Name屬性。也不得不使用嵌套的圓括號強迫其作為值(字符串)傳送給該Folders集合的Item方法。
用下面的JScript程序可完成同樣的工作:
// In JScript:
// Create a FileSystemObject instance
var objFSO = Server.CreateObject('Scripting.FileSystemObject');
// Get a reference to drive C
var objDriveC = objFSO.GetDrive('C:');
// Get a reference to the root folder
var objRoot = objDriveC.RootFolder;
// Get a reference to the first folder in the SubFolders collection
var colAllFolders = new Enumerator(objRoot.SubFolders);
var objFolder1 = colAllFolders.item();
// Get a reference to the Files collection for this folder
var colFiles = new Enumerator(objFolder1.Files);

// Iterate through all the files in this collection
for (; !colFiles.atEnd(); colFiles.moveNext()) {
  objFile = colFiles.item()
  Response.Write('Name: ' + objFile.Name + '   ');
  Response.Write('ShortName: ' + objFile.ShortName + '   ');
  Response.Write('Size: ' + objFile.Size + ' bytes    ');
  Response.Write('Type: ' + objFile.Type + '<BR>');
  Response.Write('Path: ' + objFile.Path + '   ');
  Response.Write('ShortPath: ' + objFile.ShortPath + '<BR>');
  Response.Write('Created: ' + objFile.DateCreated + '   ');
  Response.Write('Accessed: ' + objFile.DateLastAccessed + '   ');
  Response.Write('Modified: ' + objFile.DateLastModified + '<P>');
}
兩個程序的結果是相同的
    在C驅動器上的第一個文件夾可能是CAConfig,缺省情況下該文件夾是空的。這種情況下,可先向該文件夾復制一些文件,完成實驗以后再刪除這些文件。

 --------------------------------------------
QTP:FileSystemObject基礎知識
 在QTP測試中,比較本地的兩個文件是不是相同,需要使用VBScript的FileSystemObject對象,在此作簡要的概述
一.基礎FileSystemObject
1.     創建 FileSystemObject 對象
Dim fso
Set fso = CreateObject(\"Scripting.FileSystemObject\")
  Scripting 是類型庫的名字,而 FileSystemObject 則是想要創建的對象的名字。
  要用 FileSystemObject (FSO) 對象模式來編程,則:使用 CreateObject 方法來創建 FileSystemObject 對象。 
  FSO 對象模式包含在 Scripting 類型庫中,該庫位于 Scrrun.dll 文件中。因而,要使用 FSO 對象模式,必須把 Scrrun.dll 放在 Web 服務器的適當系統目錄中。
2.     使用方法:
  訪問現有驅動器、文件和文件夾
GetDrive()、GetFolder()、GetFile()、CreateFolder()、CreateFile()、CreateTextFile ()、OpenTextFile()、FolderExists(url)、DeleteFolder(url)、MoveFolder(src,to)、FileExists(url)、CopyFile()、MoveFile()、DeleteFile()、
例如:
Dim fso, f1
Set fso = CreateObject(\"Scripting.FileSystemObject\")
Set f1 = fso.GetFile(\"c:\\test.txt\")
3.     訪問屬性:
Name、Path、Size、Type、DateLastModified(上一次修改的文件時間)
二.FSO的一些特殊功能
1.        GetSpecialFolder Method 返回特定的Windows文件夾的路徑:
  Windows安裝目錄;Windows系統目錄;Windows臨時目錄 
  FSO.GetSpecialFolder([0, 1, or 2])  
2.        GetTempName Method 返回一個隨機產生的文件或者目錄名字,用于存儲臨數據
3.        GetAbsolutePathName Method 返回文件夾的絕對路徑(類似于Server.MapPath)。
比如,FSO.GetAbsolutePathName(\"region\") 將返回類似于下面的結果:\"c:mydocsmyfolder egion\" 
4.        GetExtensionName Method 返回路徑中最后部分的擴展名 (比如:FSO.GetExtensionName(\"c:docs est.txt\") 將返回txt) 
5.        GetBaseName and GetParentFolder Methods 返回路徑中最后部分的父文件夾 (比如:FSO.GetParentFolder (\"c:docsmydocs\") 將返回’docs’) 
6.        Drives Property 返回所有本地可用驅動器的集合,用于建立資源瀏覽器樣的用戶接口。