|
5.5.1 創(chuàng)建TextStream對(duì)象的方法 有三個(gè)常用方法用于創(chuàng)建或打開一個(gè)文本文件并返回TextStram對(duì)象,如表5-13所示: 表5-13 創(chuàng)建TextStream對(duì)象的方法及說明 方 法 說 明
CreateTextFile (filename,overwrite,unicode) 在磁盤上用指定的文件名filename創(chuàng)建一個(gè)新文本文件,并返回一個(gè)與該文件對(duì)應(yīng)的TextStream對(duì)象。如果可選的overwrite參數(shù)設(shè)置為True,將覆蓋具有同樣路徑的同名文件。缺省的overwrite是False。如果可選的unicode參數(shù)設(shè)置為False,該文件的內(nèi)容將存儲(chǔ)為Unicode格式。缺省的unicode是False
OpenTextFile (filename,iomode,create,format) 打開或創(chuàng)建(如果不存在)一個(gè)名為filename的文件,并且返回與該文件對(duì)應(yīng)的TextStream對(duì)象。filename參數(shù)可以包含絕對(duì)或相對(duì)路徑。iomode參數(shù)說明需要的訪問類型。容許值是ForReading(1)(缺省)、ForWriting(2)、ForAppending(8)。寫入或追加到一個(gè)不存在的文件時(shí),如果create參數(shù)設(shè)置為True,將創(chuàng)建一個(gè)新文件。缺省的create是False。format參數(shù)說明了讀或?qū)懳募䲡r(shí)的數(shù)據(jù)格式。容許值是TristateFalse(0)(缺省),說明用ASCII數(shù)據(jù)格式;TristateTrue(-1)說明用Unicode數(shù)據(jù)格式;TristateUseDefault(-2)說明數(shù)據(jù)使用系統(tǒng)缺省的格式
OpenAsTextStream (iomode,format) 打開一個(gè)指定的文件并且返回一個(gè)TextStream對(duì)象,可用于對(duì)該文件的讀、寫或追加。iomode參數(shù)說明了需要的訪問類型。容許值是ForReading(1)(缺省)、ForWriting(2)、ForAppending(8)。Format參數(shù)說明了讀寫文件的數(shù)據(jù)格式。容許值是TristateFalse(0)(缺省),說明用ASCII數(shù)據(jù)格式;TristateTrue(-1)說明用Unicode數(shù)據(jù)格式;TristateUseDefault(-2)說明使用系統(tǒng)缺省的格式
上面列出的方法在FileSystemObject、Folder和File對(duì)象中的實(shí)現(xiàn)有所不同。如表5-14所示: 表5-14 三個(gè)對(duì)象中包含的方法 方 法 FileSystemObject對(duì)象 Folder對(duì)象 File對(duì)象
CreateTextFile 有 有 有
OpenTextFile 有 無 無
OpenAsTextStream 無 無 有
因此,可以使用這些方法創(chuàng)建一個(gè)新的文本文件,或者打開一個(gè)已存在的文件。則可得到與該文件相應(yīng)的一個(gè)TextStream對(duì)象,可以使用TextStream對(duì)象的屬性和方法操作文件。 1. 創(chuàng)建新的文本文件 可以用CreateTextFile方法創(chuàng)建新的文本文件,或覆蓋一個(gè)已存在的文件。返回的TextStream對(duì)象可用來讀寫文件。 首先創(chuàng)建一個(gè)FileSystemObject對(duì)象,用來創(chuàng)建TextStream對(duì)象。下面這個(gè)例子是用VBScript創(chuàng)建一個(gè)“普通的”(即非Unicode)名為MyFile.txt的文件,并覆蓋已存在的同名文件: Set objFSO = Server.CreateObject("Scripting.FileSystemObject") Set objTStream = objFSO.CreateTextFile("C:\TextFiles\MyFile.txt", True, False) 這同樣可用JScript實(shí)現(xiàn): var objFSO = Server.CreateObject('Scripting.FileSystemObject'); var objTStream = objFSO.CreateTextFile('C:\TextFiles\MyFile.txt', true, false); 一旦創(chuàng)建了該文件,就可以使用objTStream(它是對(duì)一個(gè)TextStream對(duì)象的引用)對(duì)文件進(jìn)行操作。 2. 打開已存在的文本文件 OpenTextFile方法用于打開一個(gè)已有的文本文件。它返回一個(gè)TextStream對(duì)象,可用這個(gè)對(duì)象對(duì)文件讀或追加數(shù)據(jù)。 同樣,首先創(chuàng)建一個(gè)FileSystemObject對(duì)象,然后用其創(chuàng)建一個(gè)TextStream對(duì)象。下面的VBScript程序例子打開一個(gè)名為MyFile.txt的文件,準(zhǔn)備讀出其內(nèi)容: Set objFSO = Server.CreateObject("Scripting.FileSystemObject") Set objTStream = objFSO.OpenTextFile("C:\TextFiles\MyFile.txt", ForReading) 用JScript: var objFSO = Server.CreateObject('Scripting.FileSystemObject'); var objTStream = objFSO.OpenTextFile('C:\TextFiles\MyFile.txt', ForReading); 為了寫入一個(gè)文件或創(chuàng)建一個(gè)不存在的文件,可以用以下代碼: ' In VBScript: Set objTStream = objFSO.OpenTextFile("C:\TextFiles\MyFile.txt", ForWriting, True)
// In JScript: var objTStream = objFSO.OpenTextFile('C:\TextFiles\MyFile.txt', ForWriting, true); 如果要打開一個(gè)已有的Unicode文件,準(zhǔn)備對(duì)其追加數(shù)據(jù),但是不創(chuàng)建不存在的文件,可以用: ' In VBScript: Set objTStream = objFSO.OpenTextFile("C:\TextFiles\MyFile.txt", ForReading, _ False, TristateTrue) // In JScript: var objTStream = objFSO.OpenTextFile('C:\TextFiles\MyFile.txt', ForReading, _ fasle, TristateTrue); 3. 作為一個(gè)TextStream對(duì)象打開一個(gè)File對(duì)象 可用File對(duì)象的OpenAsTextStream方法打開與該對(duì)象相應(yīng)的文件,并且返回一個(gè)能對(duì)該文件進(jìn)行讀、寫和追加的TextStream對(duì)象。所以,給定一個(gè)File對(duì)象(這種情況下不是FileSystemObject對(duì)象)——objFileObject,可作為一個(gè)“普通的”(非Unicode)TextStream對(duì)象打開它,以供追加文件內(nèi)容: ' In VBScript: Set objTStream = objFileObject.OpenAsTextStream(ForAppending, False)
// In JScript: var objTStream = objFileObject.OpenTextFile(ForAppending, false); 注意,使用這種方法不需要文件名,因?yàn)槌绦虻膱?zhí)行通過引用File對(duì)象進(jìn)行,并且沒有create參數(shù),因?yàn)樵撐募仨氁汛嬖冢绻霃囊粋(gè)新的空的文件開始,可以用: ' In VBScript: Set objTStream = objFileObject.OpenAsTextStream(ForWriting)
// In JScript: var objTStream = objFileObject.OpenTextFile(ForWriting); 如果想讀取該文件: ' In VBScript: Set objTStream = objFileObject.OpenAsTextStream(ForReading)
// In JScript: var objTStream = objFileObject.OpenTextFile(ForReading);
5.5.2 TextStream對(duì)象成員概要 表5-15和表5-16是TextStream對(duì)象的全部屬性和方法的列表。下面將簡(jiǎn)短介紹各個(gè)重要的成員的細(xì)節(jié)。 1. TextStream對(duì)象的屬性 TextStream的屬性提供有關(guān)文件內(nèi)文件指針當(dāng)前位置的信息,如表5-15所示。注意,所有的屬性是只讀的。 表5-15 TextStream對(duì)象的屬性及說明 屬 性 說 明
AtEndOfLine 如果文件位置指針在文件中一行的末尾則返回True
AtEndOfStream 如果文件位置指針在文件的末尾則返回True
Column 從1開始返回文件中當(dāng)前字符的列號(hào)
Line 從1開始返回文件中當(dāng)前行的行號(hào)
AtEndOfLine和AtEndOfStream屬性僅對(duì)以iomode參數(shù)為ForReading的方式打開的文件可用,否則將會(huì)出錯(cuò)。 2. TextStream對(duì)象的方法 TextStream對(duì)象的方法如表5-16所示: 表5-16 TextStream對(duì)象的方法及說明 方 法 說 明
Close() 關(guān)閉一個(gè)打開的文件
Read(numchars) 從文件中讀出numchars個(gè)字符
ReadAll() 作為單個(gè)字符串讀出整個(gè)文件
ReadLine() 作為一個(gè)字符串從文件中讀出一行(直到回車符和換行)
Skip(numchars) 當(dāng)從文件讀出時(shí)忽略numchars個(gè)字符
SkipLine() 當(dāng)從文件讀出時(shí)忽略下一行
Write(string) 向文件寫入字符串string
WriteLine(string) 向文件寫入字符串string(可選)和換行符
WriteBlankLines(n) 向文件寫入n個(gè)換行符
3. 寫文本文件 一旦使用CreateTextFile、OpenTextFile或OpenAsTextStream方法以及ForWriting或ForAppending參數(shù),創(chuàng)建一個(gè)對(duì)應(yīng)于某個(gè)文件的TextStream對(duì)象,可以用下面的VBScript程序?qū)懳募完P(guān)閉文件: ' In VBScript: objTStream.WriteLine "At last I can create files with VBScript!" objTStream.WriteLine objTStream.WriteLine "Here are three blank lines:" objTStream.WriteBlankLines 3 objTStream.Write "... and this is " objTStream.WriteLine "the last line." objTStream.Close 或者用JScript: // In JScript: objTStream.WriteLine('At last I can create files with JScript! '); objTStream.WriteLine(); objTStream.WriteLine('Here are three blank lines: '); objTStream.WriteBlankLines(3); objTStream.Write('... and this is '); objTStream.WriteLine('the last line. '); objTStream.Close(); 4. 讀文本文件 一旦使用CreateTextFile、OpenTextFile或OpenAsTextStream方法以及ForReading參數(shù),創(chuàng)建一個(gè)對(duì)應(yīng)于某個(gè)文件的TextStream對(duì)象,可以用下面的VBScript程序讀文件和關(guān)閉文件: ' In VBScript: 'read one line at a time until the end of the file is reached Do While Not objTStream.AtEndOfStream 'get the line number intLineNum = objTStream.Line 'format it as a 4-character string with leading zeros strLineNum = Right("000" & CStr(intLineNum), 4) 'get the text of the line from the file strLineText = objTStream.ReadLine Response.Write strLineNum & ": " & strLineText & "<BR>" Loop objTStream.Close 或用JScript: // In JScript: // read one line at a time until the end of the file is reached while (! objTStream.AtEndOfStream) { // get the line number intLineNum = objTStream.Line; // format and convert to a string strLineNum = '000' + intLineNum.toString(); strLineNum = substr(strLineNum, strLineNum.length – 4, 4) // get the text of the line from the file strLineText = objTStream.ReadLine(); Response.Write(strLineNum + ': ' + strLineText + '<BR>'); } objTStream.Close();
5.5.3 TextStream對(duì)象舉例 為了了解使用TextStream對(duì)象操作磨滅文件的幾種方式,本書提供了一個(gè)VBScript示例頁面,該頁使用了大量的上述的代碼。從示例的Chapter05主菜單頁,選擇鏈接“Working With the TextStream Object”打開show_textstream.asp頁面。 該頁顯示了存儲(chǔ)在磁盤上名為MyFile.txt的文件的文本內(nèi)容。在<TEXTAREA>控件里顯示的文本內(nèi)容允許進(jìn)行編輯,并且下面有三個(gè)按鈕。三個(gè)按鈕的作用分別是用<TEXTAREA>控件的內(nèi)容更新(即取代)最初的文本,在已有文件內(nèi)容的后面添加文本,或用初始的缺省內(nèi)容重寫文件,如圖5-15所示:
圖5-15 TextStream對(duì)象示例頁面 1. 讀取已存在的文本文件的內(nèi)容 每次載入該頁面,將打開文本文件并將讀取的內(nèi)容置入<TEXTAREA>控件。注意我們?nèi)绾问褂肧erver.MapPath方法得到文件MyFile.txt的絕對(duì)物理路徑,該文件與示例頁面在同一目錄下。下面的程序創(chuàng)建FileSystemObject實(shí)例: <% strTextFile = Server.MapPath("MyFile.txt")
'create an instance of a FileSytemObject object Set objFSO = Server.CreateObject("Scripting.FileSystemObject") … 與書中本部分的大多數(shù)其他示例一樣,該頁包含一個(gè)<FORM>段以保存該頁面的HTML控件。ACTION是當(dāng)前頁面,因此窗體的內(nèi)容送回到同一頁面。 每次載入該頁面,<TEXTAREA>控件用文本文件的當(dāng)前內(nèi)容填充: … <FORM ACTION="<% = Request.ServerVariables("SCRIPT_NAME") %>" METHOD="POST">
The contents of the disk file <B><% = strTextFile %></B> are:<P> <TEXTAREA NAME="txtContent" ROWS="10" COLS="50" WRAP="PHYSICAL"> <% 'open the text file as a TextStream object Set objTStream = objFSO.OpenTextFile(strTextFile, ForReading) 'read one line at a time until the end of the file is reached Do While Not objTStream.AtEndOfStream 'get the line number intLineNum = objTStream.Line 'format and convert to a string strLineNum = Right("00" & CStr(intLineNum), 3) 'get the text of the line from the file strLineText = objTStream.ReadLine Response.Write strLineNum & ": " & strLineText & vbCrLf Loop objTStream.Close %> </TEXTAREA><P> 由上面程序可知道如何打開文本文件進(jìn)行讀取,遍歷整個(gè)文件每次讀取一行(而不是作為一個(gè)字符串讀出整個(gè)文件)。這是因?yàn)橐砑幼约旱男刑?hào),行號(hào)不屬于該文件的文本。對(duì)從該文件讀出的每行(讀之前),檢索并且格式化Line屬性并創(chuàng)建一個(gè)三位數(shù)字的行號(hào)。然后把行編號(hào)和文本行放置頁面的<TEXTAREA>控件內(nèi)。 2. 更新文本文件的內(nèi)容 當(dāng)點(diǎn)擊頁面的Update按鈕時(shí)(一般是在編輯了<TEXTAREA>控件里的文本以后),將把<TEXTAREA>控件里的內(nèi)容重新寫入到該文本文件內(nèi)。為此,該頁有相應(yīng)的一些ASP代碼,在創(chuàng)建HTML控件以前檢驗(yàn)Request.Form集合,查看點(diǎn)擊的是哪一個(gè)按鈕(如果有的話),然后就重新載入該頁。 如果點(diǎn)擊Update按鈕,搜集<TEXTAREA>控件的內(nèi)容作為一個(gè)字符串,分離這個(gè)字符串使之成為獨(dú)立文本選擇的數(shù)組,并且打開文本文件準(zhǔn)備重寫其內(nèi)容,然后遍歷剛剛創(chuàng)建的數(shù)組,按行號(hào)循環(huán)寫入該行的內(nèi)容: … 'look for a command sent from the FORM section buttons If Len(Request.Form("cmdUpdate")) Then 'Get contents of TEXTAREA control strNewText = Request.Form("txtContent") 'Split it into an array of lines at each carriage return arrLines = Split(strNewText, vbCrLf) 'Open the text file for writing, which replaces all existing content Set objTStream = objFSO.OpenTextFile(strTextFile, ForWriting) For intLine = 0 To UBound(arrLines) strThisLine = arrLines(intLine) 'Write out each line in turn as long as it’s got a line number If Len(strThisLine) > 4 Then objTStream.WriteLine Mid(strThisLine, 6) Next objTStream.Close End If … HTML<TEXTAREA>控件可在返回的Value中增加額外字符,這依賴于原始HTML頁內(nèi)的內(nèi)容格式和WRAP屬性的設(shè)置。特別是應(yīng)在ASP腳本結(jié)束定界符“%>”后立即寫上</TEXTAREA>標(biāo)記,以防止增加一個(gè)額外的回車符號(hào)。即使用: %></TEXTAREA><p> 而不使用: %> </TEXTAREA><P> 3. 向文本文件追加內(nèi)容 當(dāng)點(diǎn)擊Append按鈕時(shí),可對(duì)已有的文件追加內(nèi)容,與修改該文件內(nèi)容類似,如圖5-16所示。區(qū)別是打開該文件是為了追加而不是為了改寫文件。調(diào)用OpenTextFile方法時(shí)可增加額外參數(shù),防止在指定的文件2不存在時(shí)創(chuàng)建新文件。 … If Len(Request.Form("cmdAppend")) Then 'append contents of TEXTAREA to file strNewText = Request.Form("txtContent") arrLines = Split(strNewText, vbCrLf) Set objTStream = objFSO.OpenTextFile(strTextFile, ForAppending, False) For intLine = 0 To UBound(arrLines) strThisLine = arrLines(intLine) If Len(strThisLine) > 4 Then objTStream.WriteLine Mid(strThisLine, 6) Next objTStream.Close End If …
圖5-16 向文本文件追加內(nèi)容時(shí)的示例頁面 4. 重寫缺省內(nèi)容 最后,Restore按鈕用來將初始缺省內(nèi)容簡(jiǎn)單地重寫回文本文件。代碼與用TextStream的方法寫一個(gè)文本文件類似: … If Len(Request.Form("cmdDefault")) Then 'write out default contents to file Set objTStream = objFSO.CreateTextFile(strTextFile, True, False) objTStream.WriteLine "At last I can create files with VBScript!" objTStream.WriteLine objTStream.WriteLine "Here are three blank lines:" objTStream.WriteBlankLines 3 objTStream.Write "... and this is " objTStream.WriteLine "the last line." objTStream.Close End If
5.6 小結(jié) 本章講述了在ASP頁面中使用對(duì)象和組件的強(qiáng)大能力。首先討論對(duì)象和組件的一般特性,以及它們的類型。然后集中論述了如何在ASP(及客戶端)腳本代碼內(nèi)創(chuàng)建對(duì)象實(shí)例。 在頁面上使用的許多對(duì)象可能都是“外部”組件,這些組件安裝在服務(wù)器上,獨(dú)立于ASP。本章所討論的對(duì)象,當(dāng)ASP使用一種缺省的腳本語言(如VBScript或JScript)時(shí),總是可用的。其實(shí)現(xiàn)是通過scrrun.dll文件里的腳本運(yùn)行期庫完成的。 這些對(duì)象是指Dictonary對(duì)象、FileSystemObject對(duì)象和TextStream對(duì)象。 Dictionary對(duì)象為我們提供了存儲(chǔ)值的一種有效方式,可根據(jù)名字進(jìn)行索引和訪問,而不是根據(jù)一個(gè)數(shù)字進(jìn)行訪問。這是存儲(chǔ)名字/值對(duì)這樣的數(shù)據(jù)的理想方式。 FileSystemObject對(duì)象和TextStream對(duì)象相互之間聯(lián)系密切,可使用它們?cè)L問服務(wù)器或網(wǎng)絡(luò)(映射)的磁盤驅(qū)動(dòng)器的目錄。FileSystemObject對(duì)象提供對(duì)驅(qū)動(dòng)器、文件夾(目錄)和文件的存取,并提供了用于對(duì)于獲得更多的信息或移動(dòng)、復(fù)制、刪除它們的屬性及方法。 可以創(chuàng)建對(duì)應(yīng)于系統(tǒng)內(nèi)的任何文件的TextStream對(duì)象,并通過該對(duì)象對(duì)文件進(jìn)行讀取和寫入。對(duì)于讀寫過程它作為文本文件操作,甚至可以處理Unicode格式的文件。對(duì)文件系統(tǒng)的導(dǎo)航和讀寫能力的結(jié)合允許對(duì)服務(wù)器文件系統(tǒng)進(jìn)行極其復(fù)雜的控制。還可以在客戶端腳本代碼中使用對(duì)象(有一定限制)。
|