基本簡介
在ASP中,FSO的意思是File System Object,即檔案系統對象。將要操縱的計算機檔案系統,在這裡是指位於web伺服器之上。所以,確認你對此擁有合適的許可權。理想情況下,你可以在自己的機器上建立一個web伺服器,這樣就能方便地進行測試。如果運行於Windows平台,請試一試微軟公司的免費個人Web伺服器PWS。FSO模型對象:
Drive Object:驅動器對象供存取磁碟或者網路驅動器;
File System Object Object:檔案系統對象供存取計算機的檔案系統;
Folder Object:資料夾對象供存取資料夾的所有屬性;
Text Stream Object:文本流對象供存取檔案內容。
可以使用上面的對象做計算機上的任何事情,也包括破壞活動。所以,請小心使用FSO。在web環境中,存儲信息是非常重要的,比如用戶信息,日誌檔案等。FSO提供了一個強大且簡單的方法高效率地保存數據。在這篇文章裡面,著重討論File System Object和Text Stream對象。FSO由微軟公司提供支持,對於非Windows系統,不能再使用ASP。
使用方法
為了使用FSO來執行所有的工作,首先要創建對象,代碼就象下面這樣:
這樣就建立了FSO並且賦予變數fso,接著就可以使用熟悉的object.method語法來執行檔案系統的操作〔查看VisualBasic文檔,獲取更多的關於對象和對象嚮導編程的知識〕。在這裡,可以使用fso.method或者fso.propert
y,這些將在下面的例子中看到。FSO模型位於由微軟提供的腳本運行時間DLL檔案中,它是scrrun.dll。你可以在任何應用程式中引用這個DLL檔案,比如MSAccess,Word。就是說,並非僅僅限制在ASP中套用它。
FSO方法一個簡要的FSO方法列表:
Copy File拷貝一個或者多個檔案到新路徑;
Create Text File創建檔案並且返回一個Text Stream對象;
Delete File刪除一個檔案;
Open Text File打開檔案並且返回Text Stream對象,以便讀取或者追加。如果想了解完整的FSO方法與屬性,請查閱微軟MSDN。
許可權許可
FSO以創建它的用戶帳戶許可權運行,換言之,如果有人從Internet上訪問你的頁面,那么這個internet帳戶就創建FSO。如果以administrator的身份登錄計算機,並且登錄頁面,那么administrator帳戶就創建了FSO。這是非常重要的,因為一定的帳戶擁有一定的許可權,並且FSO需要一些許可權從而能完整的執行功能。internet帳戶(IUSER_Machine Name,Machine Name是伺服器的名字)一般只擁有讀許可權,這意味著用戶將不能寫入留言簿檔案。然而,有幾個選擇可以繞過這個問題。首先,也是很困難的,是要求用戶在填寫留言簿前登錄到伺服器。然而,留言簿的要點是從匿名用戶處收集信息,如果要求用戶登錄,就必須要知道他們是誰。因此,跳過這個選擇,看下一個。
第2個方法是創建一個目錄或者檔案,IUSER_Machine Name用戶對此有寫許可權。這樣做可能開放了一些潛在的安全漏洞,因為任何知道正確目錄並具備一定web技巧的人就能在伺服器上填充內容。這是一個很嚴重的禁忌。所以你必須確認在隱藏的場所保存了這些可寫目錄的信息,並且儘可能地將這些目錄設定在web目錄結構以外(比如在Windows下,這是一個不在inetpub目錄下的一個目錄)。
檔案讀取
現在已經有了一些用戶信息保存在檔案中,就像一個簡單的資料庫。假設有一個用戶想了解所有的訪問者,就要從登記的信息中分離出相關部分,因為沒有象資料庫一樣擁有結構化的列。在所創建的檔案中,第1行是用戶名,第2行是他們的主頁,第3行是他們的電子郵件地址。隨後登記的用戶也是按照這樣的結構存儲他們的信息,所以每3行將包含一個用戶的登記信息。知道了這些,就可以編寫下面的代碼來顯示信息:<%
'createthefsoobject
setfso=Server.Createobject("Scripting.FileSystemObject")
path="c:empest.txt"
'openthefile
setfile=fso.OpenTextFile(path,1)<--For
reading
接著,分析每一行,並且格式化數據:
dountilfile.AtEndOfStream
Response.write("Name:"&file.ReadLine&"")
Response.write("HomePage:"&file.ReadLine&"")
Response.write("Email:"&file.ReadLine&"")
loop
'closeandcleanup
file.close
setfile=nothing
setfso=nothing
%>
這裡僅僅做了一個非常簡單的輸出,可以根據情況包含表格或者DHTML表單信息。如果已經正確地建立並寫入了檔案,上面的小小循環將合適地列出資料庫中的每一個人的信息。ReadLine方法讀取1行內容,直到遇到換行符,隨後的Read Line調用將讀取下一行。At End Of Stream是Text Stream對象的屬性,何時遇到檔案的尾部。假設由於某種原因,沒有正確地形成檔案,如果一個用戶只有2行信息而不是3行,那么就會產生一些錯誤。這裡的循環取回檔案中的下3行信息,如果沒有3行多的信息,就將出現如下的錯誤信息:Serverobjecterror'ASP0177:800a003e' 所以,一定要添加一些錯誤處理代碼,以防檔案中插入了多餘的行或者少了必要的行信息。
檔案寫入
假設你想創建一個簡單的留言簿,你可以建立一個資料庫,在其中存儲用戶的信息。然而,如果並不需要資料庫的強大功能,使用FSO來存儲信息將節省你的時間和金錢。並且,一些ISP也許限制了web上的資料庫套用。假設你在一個表單中收集了一些用戶信息,這裡是一個簡單表單HTML代碼:再看formhandler.asp中處理表單的代碼:
<%
'Getforminfo
strName=Request.Form("username")
strHomePage=Request.Form("homepage")
strEmail=Request.Form("Email")
'createthefsoobject
Setfso=Server.CreateObject("Scripting.FileSystemObject")
迄今為止,還沒有新鮮的東西,無非是獲取表單域的值並且賦值到變數。下面出現了有趣的部分-寫檔案:
path="c:empest.txt"
ForReading=1,ForWriting=2,ForAppending=3
'openthefile
setfile=fso.opentextfile(path,ForAppending,TRUE)
'writetheinfotothefile
file.write(strName)&vbCrLf
file.write(strHomePage)&vbcrlf
file.write(strEmail)&vbcrlf
'closeandcleanup
file.close
setfile=nothing
setfso=nothing
OpenTextFile方法返回一個TextStream對象,它是FSO模型中的另外一個對象。TextStream對象揭示了操作檔案內容的方法,比如寫、讀一行、跳過一行。VB常量vbcrlf產生一個換行符。在OpentextFile的命令參數中定義了TRUE,這就告訴了系統,如果檔案不存在,就創建它。如果檔案不存在,並且沒有定義TRUE參數,就會出錯。現在轉到目錄c:emp,打開test.txt,你可以看到如下的信息:
User'sname
User'shomepage
User'semail
這些單詞可以被輸入在表單中的任何內容所替換。
搜尋功能
建立搜尋引擎的關鍵是遞歸。主要地,編寫一段代碼搜尋目錄下的檔案,然後對所有的目錄循環執行同樣的代碼。因為不能確定總共有多少個子目錄,所以必須一遍又一遍地執行搜尋代碼,直到結束。遞歸調用非常好,下面來創建搜尋頁面。假設已經建立了一個HTML表單,用戶在其中輸入一個搜尋字元串。DimobjFolder
DimstrSearchText
DimobjFSO
strSearchText=Request.Form("SearchText")"&objFile.Name&""
bolFileFound=True
EndIf
objTextStream.Close
Next
'Here'stherecursionpart-foreach
'subfolderinthisdirectory,runtheSearchfunctionagain
ForEachobjSubFolderinobjFolder.SubFolders
SearchobjSubFolder
Next
EndFunction
為了能打開檔案,FSO需要實際的檔案路徑,而不是web路徑。比如,是c:inetpubwwwrootempindex.html,而不是www.enfused.com/temp/index.html或者/temp/index.html。為了將後者轉換為前者,使用Server.MapPath("filename"),filename表示web路徑名。上面的代碼將在你指定的初始目錄下的資料夾的每一個子目錄中執行,在這裡,初始目錄是指web根目錄“/”。然後就簡單地打開目錄下的每一個檔案,看看其中是否包含指定的字元串,如果找到字元串就顯示那個檔案的連結。注意,隨著檔案和子目錄數量的增加,搜尋花費的時間也將增加。如果需要繁重的搜尋工作,建議你採取其他的方法,比如微軟公司的索引伺服器Index Server。
內容管理
對檔案改名。為了跟蹤所有的文檔,你將要重新命名它們以便唯一,這樣就可以被系統容易地區別。很不幸,FSO不允許簡單的檔案改名操作,所以不得不修改一下。<%
'createthefsoobject
setfso=Server.Createobject("Scripting.FileSystemObject")
path="c:empest.txt"
strDate=Replace(Date(),"/","")
strDir="c:inetpubwwwrootarticles"&strDate
strNewFileName=Hour(Now)&"_"&Minute(Now)&"_"&
second(Now)&".html"
'opentheoldfile
setfile=fso.opentextfile(path,1)<--Forreading
strText=file.readall
setfile=nothing
'checkforand/orcreatefolder
ifnotfso.folderexists(Server.MapPath(strDir))then
setf=fso.CreateFolder(Server.MapPath(strDir))
else
setf=fso.GetFolder(Server.MapPath(strDir))
endif
'createandwritenewfile
setfile=fso.Createtextfile(f.path&""&strNewFileName)
file.write(strText)
setf=nothing
file.close
setfile=nothing
'deletetheoldfile
fso.DeleteFile(path&""&rst("FileName")&i)
'cleanup
setfso=nothing
FSO能力的不足在這裡卻成了優勢,可以一次執行2步。首先,打開檔案並讀入檔案的內容。假設這裡要創建一個唯一的資料夾和一個唯一的檔案來存儲文章。然而,因為資料夾的路徑每天都將改變,所以必須首先檢查是否資料夾已經存在,如果不存在,就創建它。這在ifnotfso.folderexists代碼段完成。然後,取得那個路徑,創建一個新的檔案。新檔案建立完成後,刪除掉舊檔案,這通過fso.DeleteFile來完成。
這2步就是:對檔案改名,然後移動到一個更合適的目錄下。注意,在這裡還可以對檔案進行更多地操作,比如在寫入新檔案前進行一下內容的編輯。
FSO確實存在一些弱點-比如,它很難處理二進制檔案,這包括Word文檔、許多圖形格式的檔案和其他一些檔案。然而你仍然可以用其他的方式操作這些檔案-移動它們、刪除它們,等等。你不能做的就是對它們進行打開或者寫操作。另外一個限制是對於檔案長度的問題。當立刻讀寫一些內容時,所有的信息都存儲在記憶體中-內容越多,消耗的記憶體就越大。這將使每個工作都變得慢起來。所以,如果需要操作非常大的檔案,或者大量的小檔案時,考慮將檔案分割成小塊,並且經常的清除記憶體。
將應用程式融入進COM對象組件,也能大大地提高程式的速度。同樣,你也不能使用FSO來管理許可權以及檔案、資料夾的屬性,執行安全加密的一個很好方法就是將前面提到的留言簿檔案設定為唯讀,在需要時再設定為可寫,然後再修改回來。這個方法經常在CGI和Perl使用,但是很不幸,還沒有令人滿意的方法來用FSO實現。