在ASP中,FSO的意思是File System Object,即文檔系統對象。
我們將要操縱的電腦文檔系統,在這裡是指位於web伺服器之上。所以,確認您對此擁有合適的許可權。理想情況下,您能夠在自己的機器上建立一個web伺服器,這樣就能方便地進行測試。假如運行於Windows平台,請試一試微軟公司的免費個人Web伺服器PWS。
FSO 模型對象
Drive Object:磁碟機對象 供存取磁碟或網路磁碟機
FileSystemObject Object:文檔系統對象 供存取電腦的文檔系統
Folder Object:文檔夾對象 供存取文檔夾的任何屬性
TextStream Object:文字資料流對象 供存取文檔內容
您能夠使用上面的對象做電腦上的任何事情,也包括破壞活動 ;-( 所以,請小心使用FSO。在web環境中,儲存資訊是很重要的,比如使用者資訊,日誌文檔,等等。FSO提供了一個強大且簡單的方法高效率地儲存資料。在這篇文章裡面,著重討論FileSystemObject和TextStream對象。
FSO由微軟公司提供支援,對於非Windows系統,大概不能再使用ASP。
怎麼樣使用FSO?
為了使用FSO來執行任何的工作,首先要建立對象,代碼就象下面這樣:
< % Set fso = Server.CreateObject("Scripting.FileSystemObject")
% >
這樣就建立了FSO並且賦予變數fso,接著就能夠使用熟悉的object.method文法來執行文檔系統的操作〔查看Visual Basic文檔,擷取更多的關於對象和對象嚮導編程的知識〕。在這裡,我們能夠使用fso.method 或 fso.property,這些將在下面的例子中看到。
FSO模型位於由微軟提供的指令碼已耗用時間DLL文檔中,他是scrrun.dll。您能夠在任何應用程式中引用這個DLL文檔,比如MS Access,Word。 就是說,並非僅僅限制在ASP中應用他。
這裡有一個簡要的FSO方法列表:
FSO方法
CopyFile
拷貝一個或多個文檔到新路徑
CreateTextFile
建立文檔並且返回一個TextStream對象
DeleteFile
刪除一個文檔
OpenTextFile
開啟文檔並且返回TextStream對象,以便讀取或追加
假如想瞭解完整的FSO方法和屬性,請查閱微軟MSDN。下面來看幾個例子。
假設您想建立一個簡單的留言簿,您能夠建立一個資料庫,在其中儲存使用者的資訊。然而,假如並無需資料庫的強大功能,使用FSO來儲存資訊將節省您的時間和金錢。並且,一些ISP也許限制了web上的資料庫應用。
假設您在一個表單中收集了一些使用者資訊,這裡是個簡單表單HTML代碼:
< html>
< body>
< form action="formhandler.asp" method="post">
< input type="text" size="10" name="username">
< input type="text" size="10" name="homepage">
< input type="text" size="10" name="Email">
< /form>
< /body>
< /html>
再看看formhandler.asp中處理表單的代碼:
< %
' Get form info
strName = Request.Form("username")
strHomePage = Request.Form("homepage")
strEmail = Request.Form("Email")
' create the fso object
Set fso = Server.CreateObject("Scripting.FileSystemObject")
迄今為止,還沒有新鮮的東西,無非是擷取表單域的值並且賦值到變數。下面出現了有趣的部分 - 寫文檔:
path = "c: emp est.txt"
ForReading = 1, ForWriting = 2, ForAppending = 3
' open the file
set file = fso.opentextfile(path, ForAppending, TRUE)
' write the info to the file
file.write(strName) & vbcrlf
file.write(strHomePage) & vbcrlf
file.write(strEmail) & vbcrlf
' close and clean up
file.close
set file = nothing
set fso = nothing
回想一下,OpenTextFile方法返回一個TextStream對象,他是FSO模型中的另外一個對象。TextStream對象揭示了操作文檔內容的方法,比如寫、讀一行、跳過一行。VB常量vbcrlf產生一個分行符號。
在OpentextFile的命令參數中定義了TRUE,這就告訴了系統,假如文檔不存在,就建立他。假如文檔不存在,並且沒有定義TRUE參數,就會出錯。
現在轉到目錄c: emp,開啟test.txt,您能夠看到如下的資訊:
User's name
User's home page
User's email
當然,這些單詞能夠被輸入在表單中的任何內容所替換。
現在已有了一些使用者資訊儲存在文檔中,就像一個簡單的資料庫。假設有一個使用者想瞭解任何的訪問者,就要從登記的資訊中分離出相關部分,因為沒有象資料庫相同擁有結構化的列。
我們知道,在所建立的文檔中,第1行是使用者名稱,第2行是他們的首頁,第3行是他們的電子郵件地址。隨後登記的使用者也是按照這樣的結構儲存他們的資訊,所以每3行將包含一個使用者的登記資訊。知道了這些,就能夠編寫下面的代碼來顯示資訊:
< %
' create the fso object
set fso = Server.Createobject("Scripting.FileSystemObject")
path = "c: emp est.txt"
' open the file
set file = fso.opentextfile(path, 1) < -- For
reading
接著,分析每一行,並且格式化資料:
do until file.AtEndOfStream
Response.write("Name: " & file.ReadLine & " ")
Response.write("Home Page: " & file.ReadLine & " ")
Response.write("Email: " & file.ReadLine & "< p>")
loop
' close and clean up
file.close
set file = nothing
set fso = nothing
%>
這裡僅僅做了一個很簡單的輸出,但是您能夠根據情況包含表格或DHTML表單資訊。
假如已正確地建立並寫入了文檔,上面的小小迴圈將合適地列出資料庫中的每一個人的資訊。ReadLine方法讀取1行內容,直到碰到分行符號,隨後的ReadLine調用將讀取下一行。AtEndOfStream是TextStream對象的屬性,他告訴我們何時碰到文檔的尾部。
假設由於某種原因,我們沒有正確地形成文檔,假如一個使用者只有2行資訊而不是3行,那麼就會產生一些錯誤。我們這裡的迴圈取迴文檔中的下3行資訊,假如沒有3行多的資訊,就將出現如下的錯誤資訊:
Server object error 'ASP 0177 : 800a003e'
所以,一定要添加一些錯誤處理代碼,以防文檔中插入了多餘的行或少了必要的行資訊。
上面討論了基本知識,然後說說許可權許可的問題。FSO以建立他的使用者帳戶許可權運行,換言之,假如有人從Internet上訪問您的頁面,那麼這個internet帳戶就建立FSO。假如以administrator的身份登入電腦,並且登入頁面,那麼administrator帳戶就建立了FSO。這是很重要的,因為一定的帳戶擁有一定的許可權,並且FSO需要一些許可權從而能完整的執行功能。
internet帳戶(IUSER_MachineName,MachineName是伺服器的名字)一般只擁有讀許可權,這意味著使用者將不能寫入留言簿文檔。然而,有幾個選擇能夠繞過這個問題。
首先,也是很困難的,是需要使用者在填寫留言簿前登入到伺服器。然而,留言簿的要點是從匿名使用者處收集資訊,假如需要使用者登入,就必須要知道他們是誰。因此,跳過這個選擇,看下一個。
第2個方法是建立一個目錄或文檔,IUSER_MachineName使用者對此有寫入權限。這樣做可能開放了一些潛在的安全性漏洞,因為任何知道正確目錄並具備一定web技巧的人就能在伺服器上填充內容。這是個很嚴重的禁忌。所以您必須確認在隱藏的場所儲存了這些可寫目錄的資訊,並且儘可能地將這些目錄配置在web目錄結構以外(比如在Windows下,這是個不在inetpub目錄下的一個目錄)。
您也許想:好,現在我知道怎樣寫入文檔了。但能做到更多一些嗎?下面來試一試為web網站建立一個搜尋功能。
建立搜尋引擎的關鍵是遞迴。主要地,編寫一段程式碼搜尋目錄下的文檔,然後對任何的目錄迴圈執行同樣的代碼。因為不能確定總共有多少個子目錄,所以必須一遍又一遍地執行搜尋代碼,直到結束。遞迴調用很好!
下面來建立搜尋網頁面。假設已建立了一個HTML表單,使用者在其中輸入一個搜尋字串。
Dim objFolder
Dim strSearchText
Dim objFSO
strSearchText = Request.Form("SearchText") < -- The search string
' create the FSO and Folder objects
Set fso = Server.CreateObject("Scripting.FileSystemObject")
Set objFolder = objFSO.GetFolder(Server.MapPath("/"))
Search objFolder
上面的代碼簡單地初始設定變數,Search函數執行搜尋功能,描述如下:
Function Search(objFolder)
Dim objSubFolder
'loop through every file in the current
folder
For Each objFile in objFolder.Files
Set objTextStream = objFSO.OpenTextFile(objFile.Path,1) < -- For Reading
'read the file's contents into a
variable
strFileContents = objTextStream.ReadAll
'if the search string is in the file, then
write a link
' to the file
If InStr(1, strFileContents, strSearchText, 1) then
Response.Write "< A HREF=""/" & objFile.Name & _
""">" & objFile.Name & "< /A>< BR>"
bolFileFound = True
End If
objTextStream.Close
Next
'Here's the recursion part - for each
' subfolder in this directory, run the Search function again
For Each objSubFolder in objFolder.SubFolders
Search objSubFolder
Next
End Function
為了能開啟文檔,FSO需要實際的文檔路徑,而不是web路徑。比如,是c:inetpubwwwroot empindex.html, 而不是www.enfused.com/temp/index.html 或 /temp/index.html。 為了將後者轉換為前者,使用Server.MapPath("filename"), filename表示web路徑名。
上面的代碼將在您指定的初始目錄下的文檔夾的每一個子目錄中執行,在這裡,初始目錄是指web根目錄“/”。然後就簡單地開啟目錄下的每一個文檔,看看其中是否包含指定的字串,假如找到字串就顯示那個文檔的連結。
注意,隨著文檔和子目錄數量的增加,搜尋花費的時間也將增加。假如需要繁重的搜尋工作,建議您採取其他的方法,比如微軟公司的索引伺服器Index Server。