主頁(yè) > 知識(shí)庫(kù) > 奇妙的文件系統(tǒng)對(duì)象組件

奇妙的文件系統(tǒng)對(duì)象組件

熱門標(biāo)簽:銀行業(yè)務(wù) 阿里云 電子圍欄 Linux服務(wù)器 團(tuán)購(gòu)網(wǎng)站 服務(wù)器配置 Mysql連接數(shù)設(shè)置 科大訊飛語(yǔ)音識(shí)別系統(tǒng)
翻譯 討飯貓

很久以前(其實(shí)就幾個(gè)月)就知道 Chinaasp 有個(gè)實(shí)際效果象黑客的ASE程序,最近 Chinaasp 又提供了精華區(qū)全文檢索功能??磥砦募到y(tǒng)對(duì)象組件還是很有用的,對(duì)吧?如果你對(duì)此有興趣,可以看看這篇文章。本文屬入門級(jí),修行還靠你自己,呵呵。

注意:我們?cè)谙挛闹幸僮鞯氖荳eb服務(wù)器的文件系統(tǒng),所以首先要確定你對(duì)該服務(wù)器有足夠的權(quán)限。如果你不想麻煩你的Web Master,你也可以用微軟的Personal Web Server來進(jìn)行你的試驗(yàn)。

FSO對(duì)象包括
驅(qū)動(dòng)器對(duì)象(Drive Object)用來存取本地盤或網(wǎng)絡(luò)盤,
文件系統(tǒng)對(duì)象(FielSystemObject 簡(jiǎn)稱FSO)是用來存取文件系統(tǒng)
文件夾對(duì)象(Folder Object)用于存取文件夾的各種屬性
文本流對(duì)象(TextStream Object 簡(jiǎn)稱TS)存取文件內(nèi)容

使用以上對(duì)象,你的確可以在一臺(tái)電腦上為所欲為,但同樣也可能會(huì)造成災(zāi)難,所以在使用FSO的時(shí)候要注意安全,特別是在Web應(yīng)用中,Web服務(wù)器中會(huì)存儲(chǔ)諸如用戶信息,日志文件等等重要信息,更要格外小心。在本文中,我們主要探討FSO對(duì)象和TextStream對(duì)象

(FSO由Microsoft提供,所以本文內(nèi)容只適用于Windows操作系統(tǒng)下的ASP編程。)



如何使用FSO?

要開始干壞事之前,首先要學(xué)會(huì)建立FSO。如果你曾經(jīng)在ASP中創(chuàng)建過對(duì)象,那么這事好辦:

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

現(xiàn)在我們已經(jīng)建立了FSO,并賦值給變量fso,接下來就可以使用我們熟悉的object.method方法來使用它了(如果你對(duì)對(duì)象的操作不熟悉,請(qǐng)自己去補(bǔ)課,這里恕不奉陪)。在下面的例子中,主要使用的是fso.method和fso.property。

(FSO模塊來自微軟提供的腳本運(yùn)行庫(kù)scrrun.dll中,許多應(yīng)用系統(tǒng)都會(huì)調(diào)用它,例如Access,Word等等,并非專為ASP應(yīng)用開發(fā)。)

下面是我們要用到的部分FSO方法:

CopyFile 拷貝一個(gè)或多個(gè)文件
CreateTextFile 創(chuàng)建一個(gè)文件并返回一個(gè)TS對(duì)象
DeleteFile 刪除一個(gè)文件
OpenTextFile 打開一個(gè)文件并返回一個(gè)可用于讀和添加的TS對(duì)象。

要獲得完整的FSO方法,請(qǐng)參看MSDN。下面看個(gè)例子吧。



寫文件

設(shè)想你要建立一個(gè)簡(jiǎn)單的guestbook,而又不想用復(fù)雜的數(shù)據(jù)庫(kù),或者你的ISP限制你用數(shù)據(jù)庫(kù),大可以用FSO來干。
假設(shè)你要從用戶提交的form中收集信息,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>

再看看用于處理這個(gè)form的formhandler.asp。

%
' 獲取 form信息
strName = Request.Form("username")
strHomePage = Request.Form("homepage")
strEmail = Request.Form("Email")

' 建立fso對(duì)象
Set fso = Server.CreateObject("Scripting.FileSystemObject")

path = "c:\temp\test.txt"
ForReading = 1, ForWriting = 2, ForAppending = 3

' 打開文件
set file = fso.opentextfile(path, ForAppending, TRUE)

' 把信息寫入文件
file.write(strName) vbcrlf
file.write(strHomePage) vbcrlf
file.write(strEmail) vbcrlf

' 關(guān)閉并清除對(duì)象
file.close
set file = nothing
set fso = nothing

看看上面,OpenTextFile方法返回了一個(gè)TS對(duì)象,TS對(duì)象提供了例如Write,ReadLine,SkipLine等一系列的方法來操作文件內(nèi)容。VB常量vbcrlf是換行符。

(我們?cè)贠pentextFile方法中指定了TRUE參數(shù),通知系統(tǒng)當(dāng)文件不存在時(shí)生成一個(gè)新文件。如果不用TRUE,當(dāng)文件不存在時(shí)就會(huì)返回一個(gè)難看的錯(cuò)誤提示。)

現(xiàn)在打開c:\temp\test.txt,你可以看到如下信息:

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

當(dāng)然,實(shí)際內(nèi)容是用戶的輸入。哈,一個(gè)簡(jiǎn)單的guestbook誕生啦。



讀文件

好,現(xiàn)在我們的guestbook里已經(jīng)存儲(chǔ)了不少用戶的信息了,如果這時(shí)一個(gè)用戶想看看我們?cè)L客的信息,我們得把信息再還原出來。由于不是數(shù)據(jù)庫(kù),得自己動(dòng)手來解決分段問題??纯磘est.txt,每三行就是一個(gè)用戶的信息,好辦:

%
' 建立fso對(duì)象
set fso = Server.Createobject("Scripting.FileSystemObject")
path = "c:\temp\test.txt"

'打開文件
set file = fso.opentextfile(path, 1) -- 用于讀

do until file.AtEndOfStream
Response.write("Name: " file.ReadLine " ")
Response.write("Home Page: " file.ReadLine " ")
Response.write("Email: " file.ReadLine "p>")
loop

' 關(guān)閉并清除
file.close
set file = nothing
set fso = nothing
%>

(這里我們只是將信息簡(jiǎn)單輸出,你可以根據(jù)實(shí)際情況作調(diào)整,包括輸出到表格和DHTML form中。)

ReadLine方法用于從文件中讀取一行,下次調(diào)用ReadLine方法將讀取下一行。AtEndOfStream是TS對(duì)象的一個(gè)屬性,讓你知道是否到達(dá)文件結(jié)尾。

假設(shè)由于某種原因文件有問題,例如某個(gè)用戶只有兩行,那么我們會(huì)得到以下錯(cuò)誤信息:

Server object error 'ASP 0177 : 800a003e'

所以加入一些錯(cuò)誤處理代碼是必要的。



FSO的權(quán)限問題

現(xiàn)在我們已經(jīng)對(duì)FSO有一些基本認(rèn)識(shí)了,是時(shí)候來討論一下FSO的權(quán)限問題。FSO的讀取權(quán)限就是創(chuàng)建FSO的賬號(hào)所擁有的權(quán)限。如果某人從Internet上使用這個(gè)頁(yè)面,那么創(chuàng)建FSO的就是Internet賬號(hào)。如果你用administrator本機(jī)登錄并訪問頁(yè)面,那么建立的FSO就擁有administrator的權(quán)限。

Internet賬號(hào)(IUSER_機(jī)器名)通常只有讀權(quán)限,這意味著用戶永遠(yuǎn)無(wú)法寫guestbook文件。所以必須想辦法解決。

第一個(gè)辦法,是讓用戶首先要用一個(gè)有寫權(quán)限的賬號(hào)登錄。但實(shí)際上所有從Internet訪問的用戶都是以anonymous登錄,所以這個(gè)方法比較難實(shí)現(xiàn)。

第二個(gè)方法是建立一個(gè)允許賬號(hào)為 IUSER_機(jī)器名 的用戶讀寫的目錄。但這樣可能會(huì)帶來安全漏洞。如果這個(gè)目錄讓黑客知道了,就可以往里面寫一些代碼并通過某種方式運(yùn)行它,那你就慘了。所以最好將這個(gè)目錄建立在Web路徑之外(也就是inetpub路徑之外)。



用FSO實(shí)現(xiàn)search功能

現(xiàn)在讓我們來做更進(jìn)一步的工作,用FSO在我們的Web站點(diǎn)上實(shí)現(xiàn)search功能。建立搜索引擎的關(guān)鍵是遞歸。

首先來建立搜索頁(yè)面。假設(shè)我們已經(jīng)給用戶提供了一個(gè)輸入搜索字符串的頁(yè)面。

Dim objFolder
Dim strSearchText
Dim objFSO

strSearchText = Request.Form("SearchText") -- 搜索字符串

' 建立 FSO 和文件夾對(duì)象
Set fso = Server.CreateObject("Scripting.FileSystemObject")
Set objFolder = objFSO.GetFolder(Server.MapPath("/"))

Search objFolder

上面的代碼只是進(jìn)行了一些變量初始化工作,真正的serach工作由下面這個(gè)Search函數(shù)執(zhí)行。

Function Search(objFolder)
Dim objSubFolder

'循環(huán)搜尋當(dāng)前文件夾中的每個(gè)文件
For Each objFile in objFolder.Files

Set objTextStream = objFSO.OpenTextFile(objFile.Path,1) -- For Reading

'把文件內(nèi)容讀入一個(gè)變量
strFileContents = objTextStream.ReadAll

'如果在文件中找到該字符串,寫個(gè)指到該文件的鏈接
If InStr(1, strFileContents, strSearchText, 1) then
Response.Write "A HREF=""/" objFile.Name """>" objFile.Name "/A>BR>"
bolFileFound = True
End If

objTextStream.Close

Next

'以下是遞歸部分
' 如果其中有子目錄,再調(diào)用Search函數(shù)
For Each objSubFolder in objFolder.SubFolders
Search objSubFolder
Next

End Function

該程序會(huì)自動(dòng)搜索Web root目錄以下的所有子目錄,還不錯(cuò)吧?

(FSO要使用物理絕對(duì)路徑,而不是Web Path的相對(duì)路徑。例如,要打開的是c:\inetpub\wwwroot\temp\index.html,而不能是www.enfused.com/temp/index.html 或 /temp/index.html。要將后一種路徑轉(zhuǎn)換為物理絕對(duì)路徑,使用Server.MapPath("filename")。)

隨著文件和子目錄數(shù)的增加,程序運(yùn)行的時(shí)間會(huì)變長(zhǎng)。所以如果是要提供繁重的搜尋功能,還是建議使用象 Microsoft Index Server這樣的專業(yè)工具。



用FSO進(jìn)行目錄管理

現(xiàn)在知道FSO的好處了吧?下面我們嘗試用FSO來做更復(fù)雜一些的工作。

Web目錄管理就是在Web環(huán)境下進(jìn)行文檔的新建刪除改名移動(dòng)等工作,一個(gè)好的Web目錄管理工具可以為用戶提供一個(gè)與我們慣用的環(huán)境一樣的操作方法來管理Web服務(wù)器上的文件。

那么先讓我們來試試文件改名。首先要告訴大家,不幸得很,F(xiàn)SO不允許直接文件改名,所以我們要繞個(gè)彎進(jìn)行。

%
' 建立fso對(duì)象
set fso = Server.Createobject("Scripting.FileSystemObject")

path = "c:\temp\test.txt"
strDate = Replace(Date(), "/", "")
strDir = "c:\inetpub\wwwroot\articles\&; strDate

strNewFileName = Hour(Now) "_" Minute(Now) "_" second(Now) ".html"

' 打開舊文件
set file = fso.opentextfile(path, 1) -- 用于讀
strText = file.readall
set file = nothing

' 檢查是是否要建立文件夾
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

' 創(chuàng)建并寫入新文件
set file = fso.Createtextfile(f.path "\&; strNewFileName)
file.write(strText)

set f = nothing
file.close
set file = nothing

' 刪除舊文件
fso.DeleteFile(path "\&; rst("FileName") i)

' 清除
set fso = nothing
%>

我們?cè)谶@里特別舉這個(gè)例子就是因?yàn)镕SO在這個(gè)功能上存在缺陷,所以我們必須分兩步走。首先新建一個(gè)文件,注意,由于用戶可能將文件改名到另一個(gè)目錄下,所以我們必須判斷新目錄是否存在(就是if not fso.folderexists那段代碼)。新文件建好后,用fso.DeleteFile 將舊文件刪除。



FSO功能上的弱點(diǎn)

FSO還是存在一些弱點(diǎn)。例如,它在處理二進(jìn)制文件的時(shí)候就不那么方便。對(duì)于象MS Word文檔,圖像等許多文件,你只能執(zhí)行移動(dòng),刪除等操作,而不能打開,讀/寫。當(dāng)然,F(xiàn)SO提供了另外一套操作它們的方法(具體請(qǐng)參考MSDN),但始終不如我們慣用的open方法那么順手。

另一個(gè)不足與文件大小有關(guān)。由于FSO操作需要經(jīng)常地將文件內(nèi)容讀入內(nèi)存,文件有多大,就需要多少內(nèi)存,所以如果你要處理大文件或一大堆小文件的話,內(nèi)存的開銷會(huì)很可觀,可能會(huì)對(duì)系統(tǒng)運(yùn)行速度有影響。解決辦法是將大文件分段處理,并記住經(jīng)常地清除內(nèi)存(把變量設(shè)為null或"",set 對(duì)象=nothing)。

此外,F(xiàn)SO不能改變文件和文件夾的屬性。例如,在建立guestbook的例子中,其實(shí)有一個(gè)安全機(jī)制我們沒有實(shí)現(xiàn),就是將保存信息的文件的屬性設(shè)為只讀,只有在更新的時(shí)候才臨時(shí)改為可寫,寫完后再改回只讀,許多用CGI或Perl寫的guestbook程序都有這種功能,可惜用FSO無(wú)法實(shí)現(xiàn)該功能。



FSO還能干些什么?

總的來說,F(xiàn)SO還是很強(qiáng)大的。FSO還有一些一般沒人注意到的很酷的功能。下面列出一些,當(dāng)你看完可能會(huì)說“呀,我以前怎么不知道?!焙呛?。

GetSpecialFolder 方法
返回一個(gè)特殊的Windows文件目錄:Windows安裝文件目錄,系統(tǒng)文件目錄,臨時(shí)文件目錄。使用方法分別是:FSO.GetSpecialFolder([0, 1, or 2])

GetTempName 方法
返回一個(gè)隨機(jī)生成的臨時(shí)文件或文件夾。象處理上面所說的將大文件分割處理的時(shí)候這個(gè)功能特別有用。(討飯貓:如果Win98常死機(jī)的話,我們經(jīng)??梢栽赪indows根目錄下看到大量的長(zhǎng)度為0的隨機(jī)文件名,估計(jì)就是這個(gè)用途)

GetAbsolutePathName 方法
返回一個(gè)文件夾的絕對(duì)路徑(有點(diǎn)象Server.MapPath)。例如,F(xiàn)SO.GetAbsolutePathName("region")會(huì)返回象"c:\mydocs\myfolder\region" 這樣的路徑,具體取決于你的當(dāng)前目錄。

GetExtensionName 方法
返回文件的擴(kuò)展名。例如 FSO.GetExtensionName("c:\docs\test.txt") 返回 "txt"。

GetBaseName 和 GetParentFolder 方法
分別返回根目錄名和父目錄名。例如 FSO.GetParentFolder ("c:\docs\mydocs") 返回 "docs"。

Drives 屬性
返回本機(jī)上所有驅(qū)動(dòng)器的集合。如果你要建立一個(gè)explorer風(fēng)格的界面,這個(gè)功能再有用不過。

記住要建立一套完善的錯(cuò)誤信息處理機(jī)制,因?yàn)樯厦孢@些功能如果遇到象文件夾不存在之類錯(cuò)誤時(shí),會(huì)返回一些可惡的錯(cuò)誤代碼。

看到這里,是不是覺得FSO有用呢?實(shí)際上,我們所提到的內(nèi)容只是冰山的一角。在Enfused等大站點(diǎn)上,還可以看到更多與此有關(guān)話題的討論。

Copyright 1999-2000 internet.com Corp. All RIGHTS RESERVED.

標(biāo)簽:衢州 廣元 萍鄉(xiāng) 大理 蚌埠 江蘇 衡水 棗莊

巨人網(wǎng)絡(luò)通訊聲明:本文標(biāo)題《奇妙的文件系統(tǒng)對(duì)象組件》,本文關(guān)鍵詞  ;如發(fā)現(xiàn)本文內(nèi)容存在版權(quán)問題,煩請(qǐng)?zhí)峁┫嚓P(guān)信息告之我們,我們將及時(shí)溝通與處理。本站內(nèi)容系統(tǒng)采集于網(wǎng)絡(luò),涉及言論、版權(quán)與本站無(wú)關(guān)。
  • 相關(guān)文章
  • 收縮
    • 微信客服
    • 微信二維碼
    • 電話咨詢

    • 400-1100-266