亚洲av色香蕉一区二区三区,十四以下岁毛片带血a级,亚洲 校园 欧美 国产 另类,亚洲av日韩av一区谷露,色欲av无码一区二区三区

您現(xiàn)在的位置: > 技術(shù)沙龍 > WEB開發(fā) > ASP > ASP中FSO的神奇功能
  • 相關(guān)軟件
    >ASP中FSO的神奇功能 創(chuàng)建者:webmaster 更新時間:2005-07-02 00:12

       在ASP中,F(xiàn)SO的意思是File System Object,即文件系統(tǒng)對象。


       我們將要操縱的計算機文件系統(tǒng),在這里是指位于web服務(wù)器之上。所以,確認你對此擁有合適的權(quán)限。理想情況下,你可以在自己的機器上建立一個web服務(wù)器,這樣就能方便地進行測試。如果運行于Windows平臺,請試一試微軟公司的免費個人Web服務(wù)器PWS。


       FSO 模型對象
    Drive Object:驅(qū)動器對象 供存取磁盤或者網(wǎng)絡(luò)驅(qū)動器
    FileSystemObject Object:文件系統(tǒng)對象 供存取計算機的文件系統(tǒng)
    Folder Object:文件夾對象 供存取文件夾的所有屬性
    TextStream Object:文本流對象 供存取文件內(nèi)容


       你可以使用上面的對象做計算機上的任何事情,也包括破壞活動 ;-( 所以,請小心使用FSO。在web環(huán)境中,存儲信息是非常重要的,比如用戶信息,日志文件,等等。FSO提供了一個強大且簡單的方法高效率地保存數(shù)據(jù)。在這篇文章里面,著重討論FileSystemObject和TextStream對象。


       FSO由微軟公司提供支持,對于非Windows系統(tǒng),大概不能再使用ASP。


       怎么樣使用FSO?


       為了使用FSO來執(zhí)行所有的工作,首先要創(chuàng)建對象,代碼就象下面這樣:


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


       這樣就建立了FSO并且賦予變量fso,接著就可以使用熟悉的object.method語法來執(zhí)行文件系統(tǒng)的操作〔查看Visual Basic文檔,獲取更多的關(guān)于對象和對象向?qū)Ь幊痰闹R〕。在這里,我們可以使用fso.method 或者 fso.property,這些將在下面的例子中看到。


       FSO模型位于由微軟提供的腳本運行時間DLL文件中,它是scrrun.dll。你可以在任何應用程序中引用這個DLL文件,比如MS Access,Word。 就是說,并非僅僅限制在ASP中應用它。


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


       FSO方法
    CopyFile 拷貝一個或者多個文件到新路徑
    CreateTextFile 創(chuàng)建文件并且返回一個TextStream對象
    DeleteFile 刪除一個文件
    OpenTextFile 打開文件并且返回TextStream對象,以便讀取或者追加


       如果想了解完整的FSO方法與屬性,請查閱微軟MSDN。下面來看幾個例子。


       假設(shè)你想創(chuàng)建一個簡單的留言簿,你可以建立一個數(shù)據(jù)庫,在其中存儲用戶的信息。然而,如果并不需要數(shù)據(jù)庫的強大功能,使用FSO來存儲信息將節(jié)省你的時間和金錢。并且,一些ISP也許限制了web上的數(shù)據(jù)庫應用。


       假設(shè)你在一個表單中收集了一些用戶信息,這里是一個簡單表單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")


       迄今為止,還沒有新鮮的東西,無非是獲取表單域的值并且賦值到變量。下面出現(xiàn)了有趣的部分 - 寫文件:


    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對象揭示了操作文件內(nèi)容的方法,比如寫、讀一行、跳過一行。VB常量vbcrlf產(chǎn)生一個換行符。


       在OpentextFile的命令參數(shù)中定義了TRUE,這就告訴了系統(tǒng),如果文件不存在,就創(chuàng)建它。如果文件不存在,并且沒有定義TRUE參數(shù),就會出錯。


       現(xiàn)在轉(zhuǎn)到目錄c: emp,打開test.txt,你可以看到如下的信息:


    User's name
    User's home page
    User's email


       當然,這些單詞可以被輸入在表單中的任何內(nèi)容所替換。

       現(xiàn)在已經(jīng)有了一些用戶信息保存在文件中,就像一個簡單的數(shù)據(jù)庫。假設(shè)有一個用戶想了解所有的訪問者,就要從登
    記的信息中分離出相關(guān)部分,因為沒有象數(shù)據(jù)庫一樣擁有結(jié)構(gòu)化的列。

       我們知道,在所創(chuàng)建的文件中,第1行是用戶名,第2行是他們的主頁,第3行是他們的電子郵件地址。隨后登記的用
    戶也是按照這樣的結(jié)構(gòu)存儲他們的信息,所以每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


       接著,分析每一行,并且格式化數(shù)據(jù):


    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
    %>


       這里僅僅做了一個非常簡單的輸出,但是你可以根據(jù)情況包含表格或者DHTML表單信息。


       如果已經(jīng)正確地建立并寫入了文件,上面的小小循環(huán)將合適地列出數(shù)據(jù)庫中的每一個人的信息。ReadLine方法讀取1
    行內(nèi)容,直到遇到換行符,隨后的ReadLine調(diào)用將讀取下一行。AtEndOfStream是TextStream對象的屬性,它告訴我們何時
    遇到文件的尾部。


       假設(shè)由于某種原因,我們沒有正確地形成文件,如果一個用戶只有2行信息而不是3行,那么就會產(chǎn)生一些錯誤。我們
    這里的循環(huán)取回文件中的下3行信息,如果沒有3行多的信息,就將出現(xiàn)如下的錯誤信息:


       Server object error 'ASP 0177 : 800a003e'


       所以,一定要添加一些錯誤處理代碼,以防文件中插入了多余的行或者少了必要的行信息。

       上面討論了基本知識,然后說說權(quán)限許可的問題。FSO以創(chuàng)建它的用戶帳戶權(quán)限運行,換言之,如果有人從Internet
    上訪問你的頁面,那么這個internet帳戶就創(chuàng)建FSO。如果以administrator的身份登錄計算機,并且登錄頁面,那么
    administrator帳戶就創(chuàng)建了FSO。這是非常重要的,因為一定的帳戶擁有一定的權(quán)限,并且FSO需要一些權(quán)限從而能完整的
    執(zhí)行功能。

       internet帳戶(IUSER_MachineName,MachineName是服務(wù)器的名字)一般只擁有讀權(quán)限,這意味著用戶將不能寫入留
    言簿文件。然而,有幾個選擇可以繞過這個問題。


       首先,也是很困難的,是要求用戶在填寫留言簿前登錄到服務(wù)器。然而,留言簿的要點是從匿名用戶處收集信息,如
    果要求用戶登錄,就必須要知道他們是誰。因此,跳過這個選擇,看下一個。


       第2個方法是創(chuàng)建一個目錄或者文件,IUSER_MachineName用戶對此有寫權(quán)限。這樣做可能開放了一些潛在的安全漏
    洞,因為任何知道正確目錄并具備一定web技巧的人就能在服務(wù)器上填充內(nèi)容。這是一個很嚴重的禁忌。所以你必須確認在
    隱藏的場所保存了這些可寫目錄的信息,并且盡可能地將這些目錄設(shè)置在web目錄結(jié)構(gòu)以外(比如在Windows下,這是一個
    不在inetpub目錄下的一個目錄)。

       你也許想:好,現(xiàn)在我知道如何寫入文件了。但能做到更多一些嗎?下面來試一試為web站點建立一個搜索功能。

       建立搜索引擎的關(guān)鍵是遞歸。主要地,編寫一段代碼搜索目錄下的文件,然后對所有的目錄循環(huán)執(zhí)行同樣的代碼。因
    為不能確定總共有多少個子目錄,所以必須一遍又一遍地執(zhí)行搜索代碼,直到結(jié)束。遞歸調(diào)用非常好!


       下面來創(chuàng)建搜索頁面。假設(shè)已經(jīng)建立了一個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函數(shù)執(zhí)行搜索功能,描述如下:


     


    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


       為了能打開文件,F(xiàn)SO需要實際的文件路徑,而不是web路徑。比如,是c:inetpubwwwroot empindex.html, 而不是
    www.enfused.com/temp/index.html 或者 /temp/index.html。 為了將后者轉(zhuǎn)換為前者,使用Server.MapPath
    ("filename"), filename表示web路徑名。


       上面的代碼將在你指定的初始目錄下的文件夾的每一個子目錄中執(zhí)行,在這里,初始目錄是指web根目錄“/”。然后
    就簡單地打開目錄下的每一個文件,看看其中是否包含指定的字符串,如果找到字符串就顯示那個文件的鏈接。


       注意,隨著文件和子目錄數(shù)量的增加,搜索花費的時間也將增加。如果需要繁重的搜索工作,建議你采取其他的方
    法,比如微軟公司的索引服務(wù)器Index Server。


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


       首先,你可能希望對文件改名。為了跟蹤所有的文檔,你將要重新命名它們以便唯一,這樣就可以被系統(tǒng)容易地區(qū)
    別。很不幸,F(xiàn)SO不允許簡單的文件改名操作,所以我們不得不修改一下。


    < %
    ' 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"


    ' open the old file
    set file = fso.opentextfile(path, 1) < -- For reading
    strText = file.readall
    set file = nothing


    ' check for and/or create folder
    if not fso.folderexists(Server.MapPath(strDir)) then
    set f = fso.CreateFolder(Server.MapPath(strDir))
    else
    set f = fso.GetFolder(Server.MapPath(strDir))
    end if


    ' create and write new file
    set file = fso.Createtextfile(f.path & "" & strNewFileName)
    file.write(strText)
    set f = nothing
    file.close
    set file = nothing


    ' delete the old file
    fso.DeleteFile(path & "" & rst("FileName") & i)
    ' clean up
    set fso = nothing
    %>


       FSO能力的不足在這里卻成了優(yōu)勢,我們可以一次執(zhí)行2步。首先,打開文件并讀入文件的內(nèi)容。假設(shè)這里要創(chuàng)建一個
    唯一的文件夾和一個唯一的文件來存儲文章。然而,因為文件夾的路徑每天都將改變,所以必須首先檢查是否文件夾已經(jīng)
    存在,如果不存在,就創(chuàng)建它。這在if not fso.folderexists代碼段完成。然后,取得那個路徑,創(chuàng)建一個新的文件。新
    文件建立完成后,刪除掉舊文件,這通過fso.DeleteFile來完成。


       這2步就是:對文件改名,然后移動到一個更合適的目錄下。注意,在這里還可以對文件進行更多地操作,比如在寫
    入新文件前進行一下內(nèi)容的編輯。

       FSO確實存在一些弱點 - 比如,它很難處理二進制文件,這包括Word文檔、許多圖形格式的文件和其他一些文件。然而你仍然可以用其他的方式操作這些文件 - 移動它們、刪除它們,等等。你不能做的就是對它們進行打開或者寫操作。

       另外一個限制是對于文件長度的問題。當立刻讀寫一些內(nèi)容時,所有的信息都存儲在內(nèi)存中 - 內(nèi)容越多,消耗的內(nèi)存就越大。這將使每個工作都變得慢起來。所以,如果需要操作非常大的文件,或者大量的小文件時,考慮將文件分割成小塊,并且經(jīng)常的清除內(nèi)存。將應用程序融入進COM對象組件,也能大大地提高程序的速度。


       同樣,你也不能使用FSO來管理權(quán)限以及文件、文件夾的屬性,執(zhí)行安全加密的一個很好方法就是將前面提到的留言簿文件設(shè)置為只讀,在需要時再設(shè)置為可寫,然后再修改回來。這個方法經(jīng)常在CGI和Perl使用,但是很不幸,還沒有令人滿意的方法來用FSO實現(xiàn)。


       還能用FSO做什么?


       在FSO中還有許多很棒的功能,但許多人沒有意識到。這些功能常常是在你感到做某些事情很難后才發(fā)現(xiàn)的,這時你經(jīng)常要感嘆到:要是我早知道這個方法就好了!


       下面列舉一下這些不常用但是卻非常酷的功能:


       很少被了解的FSO功能
    GetSpecialFolder Method 返回特定的Windows文件夾的路徑: Windows安裝目錄;Windows系統(tǒng)目錄;Windows臨時目錄 FSO.GetSpecialFolder([0, 1, or 2])
    GetTempName Method 返回一個隨機產(chǎn)生的文件或者目錄名字,用于需要存儲臨時數(shù)據(jù)時
    GetAbsolutePathName Method 返回文件夾的絕對路徑(類似于Server.MapPath)。
    比如,F(xiàn)SO.GetAbsolutePathName("region") 將返回類似于下面的結(jié)果:"c:mydocsmyfolder egion"
    GetExtensionName Method 返回路徑中最后部分的擴展名
    (比如:FSO.GetExtensionName("c:docs est.txt") 將返回txt)
    GetBaseName and GetParentFolder Methods 返回路徑中最后部分的父文件夾
    (比如:FSO.GetParentFolder ("c:docsmydocs") 將返回'docs')
    Drives Property 返回所有本地可用驅(qū)動器的集合,用于建立資源瀏覽器樣的用戶接口。


       使用上面的功能時,最好建立好出錯處理的代碼。因為如果需要的參數(shù)不存在,將會產(chǎn)生麻煩的信息。


       總結(jié)


       如我們所見,F(xiàn)SO非常有用,這里介紹的僅僅是冰山一角。你可以使用FSO建立功能強大的應用程序,簡單地完成許多任務(wù)。

    相關(guān)文章
    本頁查看次數(shù):