我的人生路  
          日歷
          <2005年7月>
          262728293012
          3456789
          10111213141516
          17181920212223
          24252627282930
          31123456
          統(tǒng)計(jì)
          • 隨筆 - 74
          • 文章 - 57
          • 評(píng)論 - 7
          • 引用 - 0

          導(dǎo)航

          常用鏈接

          留言簿(5)

          隨筆分類

          隨筆檔案

          文章分類

          文章檔案

          相冊(cè)

          顏色

          搜索

          •  

          最新評(píng)論

          閱讀排行榜

          評(píng)論排行榜

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

             我們將要操縱的計(jì)算機(jī)文件系統(tǒng),在這里是指位于web服務(wù)器之上。所以,確認(rèn)你對(duì)此擁有合適的權(quán)限。理想情況下,你可以在自己的機(jī)器上建立一個(gè)web服務(wù)器,這樣就能方便地進(jìn)行測(cè)試。如果運(yùn)行于Windows平臺(tái),請(qǐng)?jiān)囈辉囄④浌镜拿赓M(fèi)個(gè)人Web服務(wù)器PWS。

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

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

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

             怎么樣使用FSO?

             為了使用FSO來(lái)執(zhí)行所有的工作,首先要?jiǎng)?chuàng)建對(duì)象,代碼就象下面這樣:

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

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

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

             這里有一個(gè)簡(jiǎn)要的FSO方法列表:

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

             如果想了解完整的FSO方法與屬性,請(qǐng)查閱微軟MSDN。下面來(lái)看幾個(gè)例子。

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

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

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

          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方法返回一個(gè)TextStream對(duì)象,它是FSO模型中的另外一個(gè)對(duì)象。TextStream對(duì)象揭示了操作文件內(nèi)容的方法,比如寫(xiě)、讀一行、跳過(guò)一行。VB常量vbcrlf產(chǎn)生一個(gè)換行符。

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

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

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

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

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

             我們知道,在所創(chuàng)建的文件中,第1行是用戶名,第2行是他們的主頁(yè),第3行是他們的電子郵件地址。隨后登記的用
          戶也是按照這樣的結(jié)構(gòu)存儲(chǔ)他們的信息,所以每3行將包含一個(gè)用戶的登記信息。知道了這些,就可以編寫(xiě)下面的代碼來(lái)顯
          示信息:

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

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

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

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

             Server object error 'ASP 0177 : 800a003e'

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

             上面討論了基本知識(shí),然后說(shuō)說(shuō)權(quán)限許可的問(wèn)題。FSO以創(chuàng)建它的用戶帳戶權(quán)限運(yùn)行,換言之,如果有人從Internet
          上訪問(wèn)你的頁(yè)面,那么這個(gè)internet帳戶就創(chuàng)建FSO。如果以administrator的身份登錄計(jì)算機(jī),并且登錄頁(yè)面,那么
          administrator帳戶就創(chuàng)建了FSO。這是非常重要的,因?yàn)橐欢ǖ膸魮碛幸欢ǖ臋?quán)限,并且FSO需要一些權(quán)限從而能完整的
          執(zhí)行功能。

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

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

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

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

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

             下面來(lái)創(chuàng)建搜索頁(yè)面。假設(shè)已經(jīng)建立了一個(gè)HTML表單,用戶在其中輸入一個(gè)搜索字符串。

          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

             上面的代碼簡(jiǎn)單地初始化變量,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

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

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

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

             到此,你對(duì)FSO可能已經(jīng)有了很好的體會(huì)。讓我們?cè)偕钊胙芯恳徊剑瑏?lái)解決更復(fù)雜的難題。

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

          < %
          ' 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)勢(shì),我們可以一次執(zhí)行2步。首先,打開(kāi)文件并讀入文件的內(nèi)容。假設(shè)這里要?jiǎng)?chuàng)建一個(gè)
          唯一的文件夾和一個(gè)唯一的文件來(lái)存儲(chǔ)文章。然而,因?yàn)槲募A的路徑每天都將改變,所以必須首先檢查是否文件夾已經(jīng)
          存在,如果不存在,就創(chuàng)建它。這在if not fso.folderexists代碼段完成。然后,取得那個(gè)路徑,創(chuàng)建一個(gè)新的文件。新
          文件建立完成后,刪除掉舊文件,這通過(guò)fso.DeleteFile來(lái)完成。

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

             FSO確實(shí)存在一些弱點(diǎn) - 比如,它很難處理二進(jìn)制文件,這包括Word文檔、許多圖形格式的文件和其他一些文件。然而你仍然可以用其他的方式操作這些文件 - 移動(dòng)它們、刪除它們,等等。你不能做的就是對(duì)它們進(jìn)行打開(kāi)或者寫(xiě)操作。

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

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

             還能用FSO做什么?

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

             下面列舉一下這些不常用但是卻非??岬墓δ埽?

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

             使用上面的功能時(shí),最好建立好出錯(cuò)處理的代碼。因?yàn)槿绻枰膮?shù)不存在,將會(huì)產(chǎn)生麻煩的信息。

             總結(jié)

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



          歡迎大家訪問(wèn)我的個(gè)人網(wǎng)站 萌萌的IT人
          posted on 2005-07-06 10:28 一天一點(diǎn)愛(ài)戀 閱讀(127) 評(píng)論(0)  編輯  收藏

          只有注冊(cè)用戶登錄后才能發(fā)表評(píng)論。


          網(wǎng)站導(dǎo)航:
           
           
          Copyright © 一天一點(diǎn)愛(ài)戀 Powered by: 博客園 模板提供:滬江博客
          主站蜘蛛池模板: 灵台县| 石首市| 绵阳市| 轮台县| 绿春县| 保德县| 苍山县| 渭源县| 宿迁市| 社旗县| 崇左市| 巴中市| 会东县| 江孜县| 富宁县| 广南县| 榆中县| 巴中市| 通许县| 遂昌县| 横峰县| 手机| 佛坪县| 云南省| 丹江口市| 如东县| 宣化县| 四川省| 南靖县| 民丰县| 莲花县| 营山县| 观塘区| 竹溪县| 修文县| 中宁县| 尉犁县| 清水河县| 江孜县| 晋宁县| 临夏市|