1. 程式人生 > >ASP中FSO的神奇功能

ASP中FSO的神奇功能

什麼是fso     FSO是指檔案系統物件,英文單詞為File System Object。 
    FSO是ASP程式中的一個對檔案操作的控制元件,通過程式設計,可以通過該控制元件對伺服器進行讀取、新建、修改、刪除目錄以及檔案的操作。它是ASP程式設計中非常有用的一個控制元件。
    但大家可以想一下,在一臺伺服器上有許多虛擬使用者,如果一個使用者使用FSO刪除別人的檔案,那不是亂了套,所以基於安全考慮,不少的虛擬主機服務商乾脆關掉了這個控制元件,但關掉此控制元件,有的有戶想使用ASP生成檔案又變成了不可能的事,所以如果關閉了FSO會讓客戶很不方便。
    所以你在購買虛擬主機時,一定要看看你的伺服器有沒有關閉FSO許可權,用了FSO,我們就可以操縱的計算機檔案系統,在這裡是指位於web伺服器之上。所以,確認你對此擁有合適的許可權。理想情況下,你可以在自己的機器上建立一個web伺服器,這樣就能方便地進行測試。如果運行於Windows平臺,如果你還不是很瞭解FSO,請試一試微軟公司的免費個人Web伺服器PWS,或windows2000的IIS.
怎樣使用FSO?
FSO Model Objects FSO 模型物件
Drive Object 驅動器物件 Provides access to a disk or network drive 供存取磁碟或者網路驅動器
FileSystem Object 檔案系統物件 Provides access to a computer's file system
供存取計算機的檔案系統
Folder Object 資料夾物件 Provides access to all properties of a folder 供存取資料夾的所有屬性
TextStream Object 文字流物件 Provides an easy way to access a file's contents 供存取檔案內容

你可以使用上面的物件做計算機上的任何事情,也包括破壞活動 -( 所以,請小心使用FSO。在web環境中,儲存資訊是非常重要的,比如使用者資訊,日誌檔案,等等。FSO提供了一個強大且簡單的方法高效率地儲存資料。在這篇文章裡面,著重討論FileSystemObject和TextStream物件。

NOTE: FSO由微軟公司提供支援,對於非Windows系統,FSO也許無法使用。

為了使用FSO來執行所有的工作,首先要建立物件,如果比較熟悉ASP中的物件,應該很容易看懂下面的程式碼: 

<%
Set fso = Server.CreateObject("Scripting.FileSystemObject")
%>

這樣就建立了FSO並且賦予變數fso,接著就可以使用熟悉的object.method語法來執行檔案系統的操作〔檢視Visual Basic文件,獲取更多的關於物件和物件嚮導程式設計的知識〕。在這裡,我們可以使用fso.method 或者 fso.property,這些將在下面的例子中看到。

NOTE: FSO模型位於由微軟提供的指令碼執行時間DLL檔案中,它是scrrun.dll。你可以在任何應用程式中引用這個DLL檔案,比如MS Access,Word。 就是說,並非僅僅限制在ASP中應用它。

這裡有一個簡要的FSO方法列表:

File Methods FSO方法
CopyFile Copies one or more files from one place to another 拷貝一個或者多個檔案到新路徑
CreateTextFile Creates a file and returns a TextStream object 建立檔案並且返回一個TextStream物件
DeleteFile Deletes a file 刪除一個檔案
OpenTextFile Opens a file and returns a TextStream object that can be used to read from or append to the file 開啟檔案並返回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中處理表單的程式碼:


path 
="c: emp est.txt"
ForReading 
=1, ForWriting =2, ForAppending =8
' 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

 迄今為止,還沒有新鮮的東西,無非是獲取表單域的值並且賦值到變數。下面出現了有趣的部分 - 寫檔案

...
path 
="c:/temp/test.txt"
ForReading 
=1, ForWriting =2, ForAppending =8
' 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產生一個換行符。

NOTE: 在OpentextFile的命令引數中定義了TRUE,這就告訴了系統,如果檔案不存在,就建立它。如果檔案不存在,並且沒有定義TRUE引數,就會出錯。

現在轉到目錄c:/temp,開啟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
%>
NOTE: 這裡僅僅做了一個非常簡單的輸出,但是你可以根據情況包含表格或者DHTML表單資訊

如果已經正確地建立並寫入了檔案,上面的小小迴圈將合適地列出資料庫中的每一個人的資訊。ReadLine方法讀取1行內容,直到遇到換行符,隨後的ReadLine呼叫將讀取下一行。AtEndOfStream是TextStream物件的屬性,它告訴我們何時遇到檔案的尾部。

假設由於某種原因,我們沒有正確地形成檔案,如果一個使用者只有2行資訊而不是3行,那麼就會產生一些錯誤。我們這裡的迴圈取回檔案中的下3行資訊,如果沒有3行多的資訊,就將出現如下的錯誤資訊:

所以,一定要新增一些錯誤處理程式碼,以防檔案中插入了多餘的行或者少了必要的行資訊。

許可權許可

上面討論了基本知識,然後說說許可權許可的問題。FSO以建立它的使用者帳戶許可權執行,換言之,如果有人從Internet上訪問你的頁面,那麼這個internet帳戶就建立FSO。如果以administrator的身份登入計算機,並且登入頁面,那麼administrator帳戶就建立了FSO。這是非常重要的,因為一定的帳戶擁有一定的許可權,並且FSO需要一些許可權從而能完整的執行功能。

internet帳戶(IUSER_MachineName,MachineName是伺服器的名字)一般只擁有讀許可權,這意味著使用者將不能寫入留言簿檔案。然而,有幾個選擇可以繞過這個問題。

首先,也是很困難的,是要求使用者在填寫留言簿前登入到伺服器。然而,留言簿的要點是從匿名使用者處收集資訊,如果要求使用者登入,就必須要知道他們是誰。因此,跳過這個選擇,看下一個。

第2個方法是建立一個目錄或者檔案,IUSER_MachineName使用者對此有寫許可權。這樣做可能開放了一些潛在的安全漏洞,因為任何知道正確目錄並具備一定web技巧的人就能在伺服器上填充內容。這是一個很嚴重的禁忌。所以你必須確認在隱藏的場所儲存了這些可寫目錄的資訊,並且儘可能地將這些目錄設定在web目錄結構以外(比如在Windows下,這是一個不在inetpub目錄下的一個目錄)。

為web站點建立搜尋功能

你也許想:好,現在我知道如何寫入檔案了。但能做到更多一些嗎?下面來試一試為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
  
ForEach objFile in objFolder.Files
    
Set objTextStream = objFSO.OpenTextFile(objFile.Path,1<--For Reading
        
'read the file's contents into avariable
        strFileContents = objTextStream.ReadAll
        
'if the search string is in the file, then write a link
' to the file
IfInStr(1, strFileContents, strSearchText, 1then
           Response.Write 
"<A HREF=""/"& objFile.Name & _
                
""">"& objFile.Name &"</A><BR>"
           bolFileFound 
=True
        
EndIf
        objTextStream.Close
  
Next
  
'Here's the recursion part - for each
' subfolder in this directory, run the Search function again

  
ForEach objSubFolder in objFolder.SubFolders
        Search objSubFolder
  
Next
End Function
 
NOTE: 為了能開啟檔案,FSO需要實際的檔案路徑,而不是web路徑。 比如,是c:/inetpub/wwwroot/temp/index.html, 而不是www.enfused.com/temp/index.html或 /temp/index.html. 為了將後者轉換為前者,使用Server.MapPath("filename"), filename表示web路徑名。

上面的程式碼將在你指定的初始目錄下的資料夾的每一個子目錄中執行,在這裡,初始目錄是指web根目錄“/”。然後就簡單地開啟目錄下的每一個檔案,看看其中是否包含指定的字串,如果找到字串就顯示那個檔案的連結。

注意,隨著檔案和子目錄數量的增加,搜尋花費的時間也將增加。如果需要繁重的搜尋工作,建議你採取其他的方法,比如微軟公司的索引伺服器Index Server。

進行內容管理

到此,你對FSO可能已經有了很好的體會。讓我們再深入研究一步,來解決更復雜的難題。

Content management is being able to keep track of, manipulate, and generally perform tasks with content, typically documents in a web environment. Smart content management does all that in an easy, painless fashion. (Check out this article to study up on content management.) Behind the scenes of such an application is heavy duty file manipulation. Once again, enter the FSO. We need to be able to move, delete, rename, and create files, and our friend the FSO steps in nicely. In the article above, we discuss a submission system for writers to publish their content. What we don't mention is exactly what to do with the file once it's up.

首先,你可能希望對檔案改名。為了跟蹤所有的文件,你將要重新命名它們以便唯一,這樣就可以被系統容易地區別。很不幸,FSO不允許簡單的檔案改名操作,所以我們不得不修改一下。 FSO能力的不足在這裡卻成了優勢,我們可以一次執行2步。首先,開啟檔案並讀入檔案的內容。假設這裡要建立一個唯一的資料夾和一個唯一的檔案來儲存文章。然而,因為資料夾的路徑每天都將改變,所以必須首先檢查是否資料夾已經存在,如果不存在,就建立它。這在if not fso.folderexists程式碼段完成。然後,取得那個路徑,建立一個新的檔案。新檔案建立完成後,刪除掉舊檔案,這通過fso.DeleteFile來完成。

<%
' create the fso object
set fso = Server.Createobject("Scripting.FileSystemObject")
path 
="c: emp est.txt"
strDate 
=Replace(Date(), "/""")
strDir 
="c:inetpubwwwrootarticles"& strDate
strNewFileName 
=Hour(Now&"_"&Minute(Now&"_"&
second(Now&".html"