版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報或認(rèn)領(lǐng)
文檔簡介
第13章
文件操作文件概述文件的打開與關(guān)閉順序文件隨機(jī)文件二進(jìn)制文件文件基本操作文件系統(tǒng)控件文件綜合上機(jī)練習(xí)題13.1文件概述文件通常存儲在光碟、磁盤等外部介質(zhì)上,在使用時我們才會將其調(diào)入到內(nèi)存中。數(shù)據(jù)文件是指駐留在磁盤或其他外部介質(zhì)上的一個有序數(shù)據(jù)集,可以是文本文件、可執(zhí)行程序文件、數(shù)據(jù)庫文件等(既我們使用計算機(jī)時能夠在外介質(zhì)上找到的文件,也是我們接下來要學(xué)習(xí)的重點)。13.1.1文件設(shè)備在介紹文件之前,讓我們一起來了解一下計算機(jī)中用來存儲文件的設(shè)備“硬盤”。我們已經(jīng)知道了計算機(jī)一些外部設(shè)備的作用,比如說,鍵盤是用來向計算機(jī)內(nèi)輸入數(shù)據(jù)的設(shè)備,所以我們稱鍵盤為輸入設(shè)備。顯示器是用來顯示計算機(jī)內(nèi)數(shù)據(jù)信息的設(shè)備,所以我們稱顯示器為輸出設(shè)備。但是那個被封鎖在計算機(jī)里的黑匣子(也就是硬盤)應(yīng)該歸屬于什么設(shè)備呢?其實這個問題并不難于回答,只要我們把自己的位置放在計算機(jī)的核心部分CPU,就能夠非常清晰的區(qū)分開一個設(shè)備是輸入設(shè)備還是輸出設(shè)備,或其他設(shè)備。我們之所以稱鍵盤是輸入設(shè)備,是因為我們可以通過鍵盤向計算機(jī)的CPU(中央處理器)進(jìn)行數(shù)據(jù)輸入,因此我們稱鍵盤為輸入設(shè)備,而顯示器是用來將中央處理器中的數(shù)據(jù)顯示給用戶的設(shè)備,因此我們稱其為輸出設(shè)備??蓪τ谟脖P等外部存儲器來說,我們有時需要把數(shù)據(jù)從硬盤讀取到中央處理器,這時的硬盤就像計算機(jī)鍵盤一樣為中央處理器提供了數(shù)據(jù),因此我們把它看作是一個輸入設(shè)備。而當(dāng)我們?yōu)榱税袰PU中的數(shù)據(jù)長期保存,將其寫入到硬盤中去的時候,硬盤的作用就類似于顯示器,都是用來接收CPU發(fā)送的數(shù)據(jù)的,這時我們稱硬盤為輸出設(shè)備。文件是存儲在硬盤上、一組相關(guān)數(shù)據(jù)的有序集合。因此它擁有和磁盤相似的屬性。當(dāng)我們從文件中讀取數(shù)據(jù)時,我們就可以把該文件當(dāng)作一個輸入設(shè)備來使用;如果我們把內(nèi)存中的數(shù)據(jù)數(shù)據(jù)寫入到一個文件中,這時我們可以把該文件當(dāng)作一個輸出設(shè)備來使用。13.1.2文件的結(jié)構(gòu)為了有效地存取數(shù)據(jù),數(shù)據(jù)必須以某種特定的方式存放,這種特定的方式稱為文件結(jié)構(gòu)。VisualBasic中文件由記錄組成,記錄由字段組成,字段由字符組成。(1)字符(Character):是構(gòu)成文件最基本的單位??梢允菙?shù)字、字母、特殊符號或單一字節(jié)。這里所說的“字符”特指西文字符,一個西文字符在磁盤文件中用一個字節(jié)存放。如果是漢字字符,包括“全角”符號,用兩個字節(jié)存放。(2)字段(Field):也稱域。由若干個字符組成,用來表示一項數(shù)據(jù)。例如:姓名“張語真”,郵政編碼“123456”這些都是字段。(3)記錄(Record):由一組相關(guān)的字段組成。例如在學(xué)籍檔案中,每個學(xué)生的姓名、性別、家庭地址、電話號碼、郵政編碼等構(gòu)成一個記錄,如下表所示。在VisualBasic中,以記錄為單位來處理數(shù)據(jù)。姓名性別家庭地址電話號碼郵政編碼張語真女自由大道12345678123456記錄(4)文件(File):文件由紀(jì)錄構(gòu)成,一個文件中含有一個以上的記錄。例如,在學(xué)籍檔案中存有1000個學(xué)生的信息,每個人的信息是一個記錄,這1000個記錄即構(gòu)成了一個文件。13.1.3文件的分類在VB中根據(jù)文件的結(jié)構(gòu)和訪問方式,可將文件分為三類:順序存取文件、隨機(jī)存取文件和二進(jìn)制存取文件。下面分別予以介紹。1.順序存取文件順序存取是將要保存的數(shù)據(jù),依序逐個字符轉(zhuǎn)成ASCII字符,然后存入磁盤。以順序存取的方式保存數(shù)據(jù)的文件叫做順序存取文件,簡稱順序文件。順序文件存儲格式如下圖所示。順序文件存儲格式通常,記錄與記錄之間的分界字符為回車符,記錄中字段與字段之間的分界字符為逗號。在順序文件中查找某個記錄必須從文件頭開始找起,逐個比較,直到找到目標(biāo)為止。若要修改某個記錄,則需將整個文件讀出來,修改后再將整個文件寫回磁盤,因此很不靈活。但由于順序文件是按行存儲,所以它們對需要處理文本文件的應(yīng)用程序來說就是非常理想的了。例如,一般的文本文件(*.txt文件)都是順序文件。順序文件的優(yōu)點是操作簡單,缺點是無法任意取出某一個記錄來修改,一定得將全部數(shù)據(jù)讀入,在數(shù)據(jù)量很大時或只想修改某一條記錄時,則顯得非常不方便。順序文件的特點是:結(jié)構(gòu)簡單,但不能靈活的存取和增減數(shù)據(jù),因而適合存放有一定的規(guī)律且不經(jīng)常修改的數(shù)據(jù)。主要優(yōu)點是占用空間少,容易使用。2.隨機(jī)存取文件又稱直接存取文件,簡稱隨機(jī)文件或直接文件。與順序文件不同,在訪問隨機(jī)文件中的數(shù)據(jù)時,不必考慮各個記錄的排列順序和位置,可以根據(jù)需要訪問文件中的任何一個記錄。隨機(jī)文件很像一個數(shù)據(jù)庫,它由大小相同的記錄組成,每個記錄又由字段組成,字段中存放著數(shù)據(jù)。其存儲結(jié)構(gòu)如下圖所示。隨機(jī)文件存儲格式每個記錄前都有記錄號表示此記錄開始。在讀取文件時,只要給出記錄號,就可迅速找到該記錄,并將該記錄讀出;若對該記錄做了修改,需要寫到文件中時,也只要指出記錄號,新記錄將自動覆蓋原有記錄。所以,隨機(jī)文件的訪問速度快,讀、寫、修改靈活方便,但由于在每個記錄前增加了記錄號,從而使其占用的存儲空間增大。3.二進(jìn)制文件在二進(jìn)制文件中的數(shù)據(jù)均以二進(jìn)制方式存儲,存儲單位是字節(jié)(隨機(jī)文件按記錄存取,順序文件按行存?。?。在二進(jìn)制文件中,能夠存取任意所需要的字節(jié),可以把文件指針移到文件的任何地方,因此,使用二進(jìn)制文件和使用計算機(jī)內(nèi)存中的數(shù)據(jù)是一樣的。所以,這種存取方式最為靈活,但二進(jìn)制文件不能用普通的字處理軟件編輯。13.2文件的打開與關(guān)閉在VB中進(jìn)行文件操作的基本步驟如下:(1)打開(或建立)文件在我們使用一個文件之前,必須先打開或建立這個文件。如果我們要處理的文件已經(jīng)存在,則打開該文件;如果不存在,則建立該文件。(2)對文件進(jìn)行數(shù)據(jù)處理(讀、寫操作)在已經(jīng)打開的文件上進(jìn)行輸入輸出操作。就如上一節(jié)中我們提到的,把內(nèi)存中的數(shù)據(jù)傳送到相關(guān)的外部設(shè)備(例如磁盤)并作為文件存放的操作叫做寫數(shù)據(jù),而把文件中的數(shù)據(jù)傳送到內(nèi)存中的操作叫做讀數(shù)據(jù)。(3)關(guān)閉文件關(guān)閉文件,即釋放文件的控制權(quán),并釋放文件處理時所占用的內(nèi)存。13.2.1文件的打開(建立)如前所述,在對文件中的數(shù)據(jù)進(jìn)行操作之前,我們必須先打開或建立文件。同時要通知操作系統(tǒng)對文件進(jìn)行讀操作還是寫操作,將數(shù)據(jù)存到什么地方。打開文件用Open語句。其使用語法如下:Open文件名[For模式][Access訪問方式][Lock]As[#]文件號[Len=記錄長度]Open語句的作用是為文件的輸入輸出分配內(nèi)存緩沖區(qū),并指定該緩沖區(qū)使用的存取方式。說明:一、Open語句中的Open、For、Access、As和Len為關(guān)鍵字,參數(shù)“文件名”是指要打開的文件,可包含驅(qū)動器名及路徑名。其他幾個參數(shù)含義如下:(1)“模式”用來說明文件打開的方式,即指定文件的輸入輸出方式,它可以為以下幾種操作之一:Output(輸出):指定Open語句以順序方式打開文件,并且將該文件當(dāng)作一個輸出設(shè)備來使用,相當(dāng)于由內(nèi)存向硬盤寫數(shù)據(jù)。Input(輸入):指定Open語句以順序方式打開文件,并且將該文件當(dāng)作一個輸入設(shè)備來使用,相當(dāng)于由硬盤向內(nèi)存讀數(shù)據(jù)。Append(追加):指定Open語句以順序方式打開文件,并且將該文件當(dāng)作一個輸出設(shè)備來使用。與Output模式的不同之處在于,當(dāng)用Append模式打開文件時,文件指針被定位在文件的末尾。如果對文件進(jìn)行寫操作,相當(dāng)于將數(shù)據(jù)添加在文件尾部。Random(隨機(jī)):指定Open語句以隨機(jī)存取方式打開文件,此項為“模式”參數(shù)的默認(rèn)值。在隨機(jī)模式中,如果沒有Access子句,則執(zhí)行Open語句時,VB試圖按下列順序打開文件:(a)讀/寫;(b)只讀;(c)只寫。Binary:指定以二進(jìn)制方式打開文件。在這種模式下可以用Get和Put語句對該文件中任何一個字節(jié)位置上的信息進(jìn)行讀寫操作。(2)“訪問方式”說明打開文件所允許的操作,有三種方式:Read:只讀方式。Write:只寫方式。ReadWrite:讀寫皆可,只適用于隨機(jī)文件、二進(jìn)制文件和順序文件的Append模式?!霸L問方式”制定了能夠在打開的文件中進(jìn)行的操作。如果要打開的文件已經(jīng)被其他進(jìn)程打開,則VB不允許再次為該文件制定“訪問方式”,否則在執(zhí)行Open語句時會產(chǎn)生錯誤信息。(3)Lock參數(shù)是指明其他進(jìn)程對打開文件所允許的操作,可以為以下幾種操作之一:(4)“文件號”是一個1~511的整數(shù),用于表示這個文件。執(zhí)行Open語句時,打開文件的文件號與一個具體的文件相關(guān)聯(lián),其他輸入輸出語句或函數(shù)就是通過文件號與文件發(fā)生關(guān)聯(lián)。(5)記錄長度是一個整型數(shù),故其長度不能超過32767。對順序文件來說,它是指內(nèi)存緩沖區(qū)分配的字符個數(shù);對隨機(jī)文件來說,它是文件中單個記錄的長度。對于二進(jìn)制文件將忽略Len子句。LockShared:其他進(jìn)程可對此文件進(jìn)行任何讀寫操作。LockRead:不允許其他進(jìn)程讀此文件。LockWrite:不允許其他進(jìn)程寫此文件。LockReadWrite:不允許其他進(jìn)程對此文件進(jìn)行任何操作。二、Open語句兼有打開和創(chuàng)建文件兩種功能。如果我們?yōu)檩斎耄↖nput,特指把磁盤文件的數(shù)據(jù)向內(nèi)存輸入)打開的文件未找到,VB將會產(chǎn)生“文件未找到”錯誤;如果為輸出(Output)、追加(Append)或隨機(jī)(Random)模式打開的文件不存在,則建立相應(yīng)的磁盤文件。下面是一些用Open語句打開或建立文件的例子:該語句以輸出方式打開C盤根目錄上的文件abc.txt(如果不存在就建立該文件),即把文件c:\abc.txt當(dāng)作一個輸出設(shè)備來使用,準(zhǔn)備對其進(jìn)行寫操作,并為該設(shè)備指定文件號為1號。以追加輸出方式打開C盤yxz目錄下的文件abc.txt,并指定文件號為5。該語句以輸入方式打開C盤根目錄上的文件abc.txt(如果不存在就產(chǎn)生“未找到文件”錯誤),即把文件c:\abc.txt當(dāng)作一個輸入設(shè)備來使用,準(zhǔn)備對其進(jìn)行讀操作,并為該設(shè)備指定文件號為7號。Open"c:\abc.txt"ForOutputAs#1Open"c:\xyz\abc.txt"ForAppendAs#5Open"c:\abc.txt"ForInputAs#7以上幾個例子打開的文件都是按照順序方式輸入輸出的。上例先把文件名賦給一個變量FileName$,然后以隨機(jī)模式打開該文件,并且制定該文件中單個記錄的長度為256個字節(jié)。DimFileName$FileName$="c:\MyFile.dat"OpenFileNameForRandomAs#1Len=25613.2.2文件的關(guān)閉對文件操作完之后,要關(guān)閉文件,其語法:Close[#文件號1][,#文件號2]……若Close語句后無文件號,則關(guān)閉所有打開的文件。如果我們使用以下語句打開了一個文件:則可用以下語句來關(guān)閉該文件設(shè)備。Open"c:\abc.dat"ForRandomAs#1Len=256Close#113.3順序文件一般不為順序文件制定Len子句參數(shù)。因為對于順序文件來說,記錄長度這一概念沒有實際意義。一般也不為順序文件制定Access子句參數(shù)。因為對于順序文件的讀寫操作模式已經(jīng)在For后的“模式”參數(shù)中作出了明確的規(guī)定。順序文件按存儲單元進(jìn)行存儲,它通常是一個文本文件,數(shù)字和字符均以ASCII碼形式保存。下面討論順序文件的操作語句。13.3.1順序文件的打開在對任何文件進(jìn)行操作之前,必須打開文件,同時要通知操作系統(tǒng)對文件進(jìn)行讀操作還是寫操作,將數(shù)據(jù)存到什么地方。順序文件也不例外,打開文件的方法已經(jīng)在上一節(jié)中做了詳細(xì)的介紹這里就不再贅述。只是有一些細(xì)節(jié)問題需要注意。13.3.2順序文件的寫操作要建立一個順序文件或打開一個順序文件,向文件中寫數(shù)據(jù),應(yīng)該用Output模式打開文件,然后用輸出命令寫入數(shù)據(jù)。以O(shè)utput模式打開文件,就是建立文件;若文件已存在,則刪除舊文件,建立新文件。以Append模式打開文件與此很相似,二者的差別在于:以Append模式打開文件時,如果該文件已經(jīng)存在,VB并不刪除它,隨后的輸出命令把新行追加到該文件尾部。寫文件的輸出命令有Print和Write兩種,其意義如下。1.Print#語句Print#文件號,[Spc(n)|Tab(n)]字段1[;|,][Spc(n)|Tab(n)][字段2[;|,]……Print#語句的功能是,把數(shù)據(jù)寫入到指定的文件設(shè)備中去。前面的章節(jié)中,我們曾經(jīng)多次用到Print方法,Print#語句與Print方法的功能基本類似,不同的是,Print方法的輸出對象是窗體、圖片框等屏幕設(shè)備或Printer(打印機(jī)設(shè)備),而Print#語句所“寫”的對象是文件設(shè)備。在上面的格式中,“文件號”的含義同前,數(shù)據(jù)被寫入該文件號代表的文件中。其他參量,包括Spc函數(shù)、Tab函數(shù)和分號、逗號的含義都與Print方法相同,這里就不再贅述。
例如:在C盤根目錄上建立文本文件FirstFile.txt并為其關(guān)聯(lián)到文件號1,然后把字符串常量"HelloWorld!!!"和變量A的內(nèi)容寫到文件號為1的文件中,然后使用Close語句關(guān)閉該文件設(shè)備。而
則是把常量與變量的內(nèi)容“寫”到窗體對象這個屏幕輸出設(shè)備上去。Open"c:\FirstFile.txt"For0utputAs#1A$="Iamsohappy."Print#1,"HelloWorld!!!",AClose#1Print"HelloWorld!!!",A下面我們就一起來看一個將文本框中的數(shù)據(jù)進(jìn)行保存的例子:例13.1建立一個單窗體VB工程。在窗體對象Form1上添加一個文本框控件Text1和兩個個命令按鈕對象Command1和Command2,如下圖所示。要求實現(xiàn)以下功能,在文本框中輸入一些文字,鼠標(biāo)單擊命令按鈕后彈出一個對話框,在對話框中輸入文件的保存位置,然后在該位置以順序文件方式保存文本框中的文字?jǐn)?shù)據(jù)。順序文件保存程序(1)向窗體對象上添加各個控件后,按照下表改變各控件相關(guān)屬性。Name屬性Caption屬性MultiLine屬性ScrollBars屬性Text1無True3Command1保存文件無無Command2退出程序無無例13.1各控件屬性表(2)編寫以下程序代碼:PrivateSubCommand1_Click()DimFileNameAsStringFileName=InputBox("請輸入文件的保存位置","保存","c:\abc.txt")OpenFileNameForOutputAs#1Print#1,Text1.TextClose#1EndSub
PrivateSubCommand2_Click()EndEndSub(3)測試程序的運行結(jié)果。當(dāng)程序運行時,向文本框中輸入字符信息,比如“我是中國人,我熱愛我的祖國。”然后點擊保存程序命令按鈕。在彈出的對話框的文字區(qū)中輸入文件保存的位置,默認(rèn)值為:c:\abc.txt,然后用記事本程序打開該文件,我們能夠看到如下圖所示結(jié)果。程序運行結(jié)果2.Write語句前面我們曾提到,除了可以利用Print#語句向順序文件輸入數(shù)據(jù)外,還有另外的方法,這個方法就是Write語句。其格式為:Write語句的使用和Print#語句基本一樣,例如:把變量A、B、C的值寫入文件號為1的文件中。在Write語句中,“文件號”和“字段”的概念都和Print#語句一致,在此不再贅述。使用Write語句時,文件也必須是以O(shè)utput或Append模式打開的順序文件,各字段之間必須用逗號分開。Write語句的功能和Print#語句基本相同,但有以下兩點主要區(qū)別,望讀者注意:(1)當(dāng)用Write語句向文件寫數(shù)據(jù)時,數(shù)據(jù)在磁盤上以緊湊格式存放,且能自動地在數(shù)據(jù)項之間插入逗號,并給字符串加上雙引號。一旦該語句最后一個參變量被寫入到文件中后,就在這一行的末尾插入一個換行符,標(biāo)識著該記錄的結(jié)束。Write#1,A,B,CWrite#文件號,字段1,……(2)使用Write語句寫入到順序文件中的整數(shù)前沒有空格。例13.2
在磁盤上建立一個順序文件,使用Write語句向該文件中輸入若干數(shù)據(jù),然后用記事本應(yīng)用程序打開該順序文件,觀察文件內(nèi)數(shù)據(jù)的存儲方式。程序代碼如下:PrivateSubForm_Load()DimAAsIntegerDimBAsDoubleDimCAsStringA=3:B=-108.98:C="2008年奧運會在北京舉辦。"Open"c:\myfile.txt"ForOutputAs#1Write#1,A,B,CWrite#1,"我是中國人,我深愛著自己的祖國。"Close#1EndSub在本程序執(zhí)行后,我們在計算機(jī)硬盤C盤根目錄上可以找到一個文本文件(順序)myfile.txt。如果使用記事本應(yīng)用程序?qū)⑵浯蜷_觀看其內(nèi)容,其結(jié)果如下圖所示。例13.2程序運行結(jié)果以上運行結(jié)果驗證了Write語句數(shù)據(jù)輸出的特點:數(shù)據(jù)在磁盤上以緊湊格式存放,且能自動地在數(shù)據(jù)項之間插入逗號,并給字符串加上雙引號。一旦該語句最后一個參變量被寫入到文件中后,就在這一行的末尾插上一個換行符號。標(biāo)識著該記錄的結(jié)束;寫入到順序文件中的整數(shù)前沒有空格,這樣進(jìn)行數(shù)據(jù)保存有利于從文件中讀取單個數(shù)據(jù)項。13.3.3順序文件的讀操作要讀順序文件的內(nèi)容,應(yīng)該以Input模式打開該文件,然后從中讀取數(shù)據(jù)。讀數(shù)據(jù)的操作由Input#語句、LineInput#語句和Input$函數(shù)三種方法來實現(xiàn)。1.Input#語句Input#語句的作用是從文件中讀取數(shù)據(jù),并且把讀出的數(shù)據(jù)賦值給指定的字段變量。其格式如下:例如,語句的功能是從1號文件中讀取3個數(shù)據(jù),并將其分別賦值給變量A、B和C。Input#文件號,字段1[,字段2]{,……}Input#1,A,B,C例13.3
編寫程序,用Input#語句來讀取例13.2保存在磁盤文件中的數(shù)據(jù),并將讀出的數(shù)據(jù)在窗體對象上打印輸出。程序如下:PrivateSubForm_Load()Open"c:\myfile.txt"ForInputAs#1Input#1,a,b,c,dMe.ShowPrinta,bPrintcPrintdClose#1EndSub本程序運行結(jié)果如下圖所示。程序運行結(jié)果2.LineInput#語句LineInput#語句的作用是,從順序文件一次讀出一行字符串?dāng)?shù)據(jù)到指定變量。其語法格式如下:語法格式中“文件號”含義同前。字符串變量的作用是用來接收LineInput#語句讀出的字符串?dāng)?shù)據(jù)。LineInput#語句與Input#語句的作用基本相似,主要區(qū)別是:Input#語句每次從順序文件中讀取一個數(shù)據(jù)項,而LineInput#語句每次從文件中讀取一行數(shù)據(jù),并自動省略每行數(shù)據(jù)后的回車換行符。正因為LineInput#語句的這些特點,所以它經(jīng)常被用來處理文本文件。下面我們一起來看一個具體的例子。LineInput#文件號,字符串變量在編制程序前,我們有必要了解幾個與文件操作有關(guān)的函數(shù)。它們分別是:(1)LOF()函數(shù)以字節(jié)方式返回被打開文件大小。其調(diào)用語法如下:如LOF(1)返回#1文件的長度。(2)LOC()函數(shù)返回被打開文件的當(dāng)前位置。其調(diào)用語法如下:對于順序位置的計算以128字節(jié)為單位,返回當(dāng)前位置是第幾個128字節(jié);對于隨機(jī)文件,它返回當(dāng)前讀寫的記錄號;對于二進(jìn)制文件,返回當(dāng)前的字節(jié)位置。(3)EOF()函數(shù)返回值指出讀文件過程中是否到了文件末端。其調(diào)用語法如下:返回True,則到達(dá)文件末端;否則返回False。LOF(文件號)LOC(文件號)EOF(文件號)(4)FreeFile()函數(shù)返回程序中尚未被使用的文件號。在我們編制的程序中打開的文件有多個時,這個函數(shù)將變得尤為重要。還有一點要特別的注意,對于順序文件,讀寫操作不能同時進(jìn)行。每進(jìn)行一次讀或?qū)懖僮?,都必須重新打開文件,讀或?qū)懲曛笤訇P(guān)閉文件。例13.4
編寫一個類似于Windows操作系統(tǒng)記事本應(yīng)用程序一樣的文字編輯軟件。要求可以打開磁盤上的文本文件,在對文件內(nèi)容進(jìn)行編輯后還要能保存文件。其操作界面如下圖所示。簡單文本文件處理程序(1)向窗體對象上添加上各個控件后,按照下表改變各控件相關(guān)屬性。Name屬性Caption屬性MultiLine屬性ScrollBars屬性Text1無True3Command1打開文件無無Command2保存文件無無例13.4各控件屬性表(2)編寫以下程序代碼。PrivateSubCommand1_Click()location=InputBox("Open","打開文件")Iflocation<>""ThenOpenlocationForInputAs#1WhileNotEOF(1)'如果還沒有讀到文件尾,就不停止數(shù)據(jù)的讀取操作。LineInput#1,TextText1.Text=Text1.Text+Text+Chr(13)+Chr(10)'人為加上回車換行符。WendClose#1EndIfEndSubPrivateSubCommand2_Click()location=InputBox("Saveas","文件保存")Iflocation<>""Thenfilenum=FreeFile() '利用FreeFile函數(shù)得到尚未被使用的文件號。OpenlocationForOutputAsfilenumPrint#filenum,Text1.TextClose#filenumEndIfEndSub3.Input$函數(shù)Input$函數(shù)返回從指定文件中讀出的n個字符組成的字符串,其語法如下:例如,語句從1號文件中讀取前20個字符,并將其賦給字符串變量x$。Input$函數(shù)有些類似于C語言中的fread函數(shù),都是把文件當(dāng)作一個“二進(jìn)制數(shù)據(jù)流”,因此在使用Input$函數(shù)對文件進(jìn)行數(shù)據(jù)讀操作之前應(yīng)該以二進(jìn)制模式打開文件。Input$函數(shù)的作用就是從這個數(shù)據(jù)流中讀取指定的數(shù)據(jù)量,如上例中的20個字符。因此如果我們要完全讀取一個文件的內(nèi)容的話,使用Input$函數(shù)對文件進(jìn)行讀操作會獲得更高的效率。x$=Input$(n,#文件號)x$=Input$(20,#1)例如,我們可以把例13.4中讀取文件的程序代碼改編如下:PrivateSubCommand1_Click()location=InputBox("Open","打開文件")Iflocation<>""ThenOpenlocationForBinaryAs#1 '以二進(jìn)制方式打開文件,以便可以使用Input$'函數(shù)正確的進(jìn)行文件讀取。Text1.Text=input$(LOF(1),#1) '使用Input$函數(shù)讀取1號文件中的所有數(shù)據(jù)。Close#1EndIfEndSub通過以上改編,我們會發(fā)現(xiàn),在對數(shù)據(jù)量比較大的文件進(jìn)行讀操作時(比如說,文件中有600000行數(shù)據(jù)),使用Input$函數(shù)進(jìn)行數(shù)據(jù)讀取的速度要明顯高于LineInput語句。13.4隨機(jī)文件在本章第一節(jié)中我們曾經(jīng)描述了隨機(jī)文件的結(jié)構(gòu)。我們知道隨機(jī)文件的結(jié)構(gòu)很像數(shù)據(jù)庫,對隨機(jī)文件的操作實際上是對文件中的記錄進(jìn)行操作,每個記錄都有記錄號并且記錄長度全部相同。那么無論是從內(nèi)存向磁盤寫數(shù)據(jù),還是從磁盤讀數(shù)據(jù),都需要事先定義內(nèi)存空間。而VB中內(nèi)存空間的分配是靠變量說明來進(jìn)行的,所以不管是讀操作還是寫操作都必須事先在程序中定義變量,且該變量要定義成與隨機(jī)文件中的一條記錄相同的類型,一條記錄又是由多個字段組成的,每字段有不同的類型和長度。因此在程序中用來保存記錄的變量,在其說明部分應(yīng)采用用戶自定義類型說明語句,首先定義記錄的類型結(jié)構(gòu),然后再將變量說明成該類型,這樣就為這個變量申請了內(nèi)存空間,用于存放隨機(jī)文件中的一條記錄。13.4.1定義記錄類型我們提到過,隨機(jī)文件是由固定長度的記錄組成,每個記錄含有若干個字段。記錄中各字段存放在一個記錄類型中,記錄類型用Type…EndType語句定義。且定義記錄類型時,Type…EndType語句通常在標(biāo)準(zhǔn)模塊中使用,如果在窗體模塊中進(jìn)行數(shù)據(jù)類型的定義,則應(yīng)該在其前面加上Private關(guān)鍵字。關(guān)于記錄類型的定義與使用方法,已經(jīng)在前面章節(jié)中進(jìn)行了詳細(xì)的介紹,這里就不再贅述。只舉如下一例:PrivateTypeStudTypeNumAsString*8NameAsString*12AgeAsIntegerClassAsString*5EndTypeDimaStudentAsStudType13.4.2隨機(jī)文件的打開(建立)我們前面提到過,在使用一個文件進(jìn)行數(shù)據(jù)的輸入與輸出操作時,必須先打開這個文件。對于隨機(jī)文件而言,首先要以隨機(jī)模式打開文件,其使用語法如下:Open文件名ForRandomAs#文件號[Len=記錄長度]與順序文件不同的是,隨機(jī)文件讀、寫兩種操作都用Random模式打開,一經(jīng)打開即可同時進(jìn)行讀、寫操作。也就是說,對隨機(jī)文件進(jìn)行某種操作后不必關(guān)閉文件就可進(jìn)行另一種操作。因此我們才稱其為隨機(jī)讀寫文件,即隨機(jī)文件。另外,在Open語句中還要指明文件中單個記錄的長度,該長度等于記錄中各字段長度之和,且以字節(jié)為長度單位。如果省略“Len=記錄長度”子句,則以128個字節(jié)作為記錄長度的默認(rèn)值。13.4.3隨機(jī)文件的讀寫操作1.文件指針在文件被打開后,將自動生成一個文件指針。文件的讀寫操作都是在該指針指定的位置進(jìn)行的,比如:在我們使用Append模式打開一個文件時,該文件的文件指針就指向被打開的文件的末尾。在我們以順序模式使用文件時,我們是沒有必要考慮文件指針的位置的。因為順序文件,讀寫操作不能同時進(jìn)行。每進(jìn)行一次讀或?qū)懖僮?,都必須重新打開文件,讀或?qū)懲曛笤訇P(guān)閉文件。這也就意味著,我們每次使用順序文件都是把該文件完全讀入內(nèi)存緩沖區(qū),然后再對它全部的數(shù)據(jù)進(jìn)行讀寫操作。也正因為此,使用順序文件時,我們不必過多考慮它的文件指針的位置。對于隨機(jī)文件和二進(jìn)制文件,要求我們能夠?qū)υ撐募腥魏我粋€記錄進(jìn)行隨機(jī)的讀寫操作,這也就要求我們能夠人為的改變文件指針的位置。因此也就用到了Seek語句與Seek函數(shù)。(1)Seek()函數(shù),使用語法如下:該函數(shù)用來返回當(dāng)前文件指針的位置。對于隨機(jī)文件返回當(dāng)前記錄號,對于二進(jìn)制文件返回從文件頭算起的字節(jié)數(shù)。(2)Seek語句,使用語法如下:該語句用來將文件指針定位到指定的位置,對于隨機(jī)文件“位置”指的是一個記錄號,對于二進(jìn)制文件指定位到從文件頭算起的某個字節(jié)位置。Seek(文件號)Seek#文件號,位置2.隨機(jī)文件的寫數(shù)據(jù)操作向隨機(jī)文件中寫數(shù)據(jù)用Put語句,其使用語法如下:其中文件號含義同前。記錄號是可選的,其取值范圍是1~231-1。該語句是將一個記錄變量的內(nèi)容寫入所打開的磁盤文件中指定的記錄位置處。記錄號必須是大于1的整數(shù),表示寫入的是第幾條記錄;若不指定記錄號,則表示將變量內(nèi)容寫在下一記錄位置,即最近執(zhí)行Get或Put語句后的下一個記錄位置,或最近一個Seek語句所指定的文件位置。Put#文件號,[記錄號],記錄變量3.隨機(jī)文件的讀數(shù)據(jù)操作使用Get語句從隨機(jī)文件讀取數(shù)據(jù),其使用語法如下:Get#文件號,[記錄號],記錄變量其中,記錄變量的數(shù)據(jù)類型必須同文件中記錄的數(shù)據(jù)類型一致。該語句是從指定文件中,將一條由記錄號指定的記錄內(nèi)容讀入記錄變量中。記錄號概念同前,表示對第幾條記錄進(jìn)行操作,如果忽略記錄號,則表示讀出當(dāng)前記錄后的那一條記錄。例如:表示把1號文件中第一個記錄讀到aStudent變量中。既然我們已經(jīng)了解了如何對隨機(jī)文件進(jìn)行讀寫操作,那么我們一起來看如下一個簡單的程序。Get#1,1,aStudent例13.5建立如下圖所示應(yīng)用程序,然后按照下表設(shè)定各控件相關(guān)屬性。Name屬性Caption屬性Text屬性Text1~Text4無空Command1添加記錄無Command2顯示記錄無Command3程序記錄無Label1姓名無Label2學(xué)號無Label3年齡無Label4班級無Label5顯示記錄無Picture1無無隨機(jī)文件的讀寫操作
例13.5各控件屬性表要求本程序能夠?qū)崿F(xiàn),類似于簡單的數(shù)據(jù)庫的功能。即能夠向文件中插入新的記錄,并且能夠讀出指定記錄號的一個數(shù)據(jù)記錄的各字段的數(shù)據(jù)內(nèi)容。設(shè)定好相關(guān)屬性后,打開代碼窗口編寫以下代碼:PrivateTypeStudent'自定義一個記錄型數(shù)據(jù)類型StudentnameAsString*10NumAsString*8ageAsIntegerclassAsString*8EndType
DimaStudentAsStudent'聲明Student類型變量aStudentDimlastPositionAsInteger‘定義用來存放文件中最后一個記錄的記錄號的變量
PrivateSubForm_Load()'以隨機(jī)方式打開文件OpenApp.Path+"\student.dat"ForRandomAs#1Len=Len(aStudent)lastPosition=LOF(1)/Len(aStudent)'計算文件中記錄的個數(shù)EndSub
PrivateSubCommand1_Click()IfText3.Text<>""ThenlastPosition=lastPosition+1aS=Text1.TextaStudent.Num=Text2.TextaStudent.age=Cint(Text3.Text)aStudent.class=Text4.TextPut#1,lastPosition,aStudent'把新記錄添加到文件中Text1.Text=""Text2.Text=""Text3.Text=""Text4.Text=""MsgBox"新記錄添加完成!"EndIfEndSubPrivateSubCommand2_Click()DimdispPositionAsStringdispPosition=InputBox("請輸入您要查詢的記錄號,"_+Chr(13)+Chr(10)+"且記錄號數(shù)值不可超過"+CStr(lastPosition),"輸入記錄號")IfIsNumeric(dispPosition)ThenIfCInt(dispPosition)>0AndCInt(dispPosition)<=lastPositionThenGet#1,dispPosition,aStudent'從文件指定位置讀取一個記錄到記錄變量aStudentPicture1.ClsPicture1.Print"姓名:";aSPicture1.Print"學(xué)號:";aStudent.NumPicture1.Print"年齡:";aStudent.agePicture1.Print“班級:”;aStudent.classElsePicture1.Print"記錄號錯誤"EndIfElseMsgBox"請輸入數(shù)值信息。"EndIfEndSubPrivateSubCommand3_Click()EndEndSub
PrivateSubForm_Unload(CancelAsInteger)Close#1'程序結(jié)束時關(guān)閉文件回收資源EndSub程序完成后,按F5鍵運行程序,在4個文本框中填寫相應(yīng)數(shù)據(jù),然后點擊“添加記錄”命令按鈕就會向1號文件的文件尾添加一個新的記錄。然后清空4個文本框中的數(shù)據(jù),等待下次輸入。如果點擊“顯示記錄”命令按鈕,那么會彈出一個InputBox對話框,要求我們輸入欲顯示其內(nèi)容的記錄號。如果輸入一個記錄號點擊“確定”,則在Picture1圖片框上將該記錄的各字段內(nèi)容打印輸出。其運行結(jié)果如右圖所示。程序運行結(jié)果13.5二進(jìn)制文件二進(jìn)制文件中的內(nèi)容以字節(jié)為基本單位進(jìn)行存取操作的。與隨機(jī)文件相同的是:二進(jìn)制文件打開后,讀與寫操作可同時進(jìn)行。因此,二進(jìn)制訪問能提供對文件的完全控制。此外,因為二進(jìn)制文件存儲的信息和內(nèi)存數(shù)據(jù)具有完全一致的信息格式,因而不需要再對數(shù)據(jù)進(jìn)行編碼轉(zhuǎn)換。因此,當(dāng)需要保持文件大小盡量小時,應(yīng)使用二進(jìn)制文件。對二進(jìn)制文件操作時所使用的語句和對隨機(jī)文件進(jìn)行操作的語句與方法基本相似,都是使用Seek語句、Seek函數(shù)、Put方法和Get方法。但又稍有區(qū)別,讓我們一起來看看其具體操作方法。13.5.1二進(jìn)制文件的打開(建立)與其他幾種文件模式的打開語句一樣,在VB中打開二進(jìn)制文件,還是使用Open語句。其格式如下:前面我們說過,二進(jìn)制文件與隨機(jī)文件的相同點是,在文件以二進(jìn)制模式打開后,讀寫操作可同時進(jìn)行。可它們還是有區(qū)別的,二進(jìn)制文件訪問中的Open語句與隨機(jī)存取的Open語句不同,它沒有指定Len部分。這是因為,在Binary模式下進(jìn)行文件操作時,存取數(shù)據(jù)的單位是字節(jié),而不是像隨機(jī)文件一樣以記錄為基本單位。所以,如果我們在二進(jìn)制文件訪問的Open語句中包括了記錄長度,則該長度將被忽略。Open文件名ForBinaryAs#文件號13.5.2向二進(jìn)制文件中寫數(shù)據(jù)向二進(jìn)制文件寫數(shù)據(jù)仍然使用Put#語句,其語法如下:其中“文件號”概念同前,“位置”是按字節(jié)計數(shù)的讀寫位置。若默認(rèn),則文件指針從頭到尾順序移動。Put#語句向文件寫的字節(jié)數(shù)等于變量長度。Put#文件號,[位置],變量13.5.3從二進(jìn)制文件中讀數(shù)據(jù)從二進(jìn)制文件讀數(shù)據(jù)仍然使用Get#語句,其語法如下:其中“文件號”和“位置”概念同前,Get#語句從二進(jìn)制文件中讀出的字節(jié)數(shù)等于變量長度。在二進(jìn)制文件讀寫的過程中,也常常用到Seek函數(shù)和Seek語句來定位和返回當(dāng)前文件指針:(1)Seek()函數(shù)
使用語法如下:對于二進(jìn)制文件來說,該函數(shù)用來返回以字節(jié)為單位、當(dāng)前文件指針的位置。(2)Seek語句
使用語法如下:對于二進(jìn)制文件來說,該語句用來將文件指針定位到recnumber字節(jié)處。Get#文件號,[位置],變量Seek(文件號)Seek文件號,recnumber13.5.4一個使用二進(jìn)制模式對文件操作的具體實例在編制本實例程序之前,我們必須了解一些輔助知識,以便我們能夠讀懂為什么要這樣編制程序。首先,我們要了解24位真彩色BMP格式位圖的文件結(jié)構(gòu)。BMP(Bitmap-File)圖像文件是Windows采用的圖像文件格式,在Windows環(huán)境下運行的所有圖像處理軟件都支持BMP圖像文件格式。Windows系統(tǒng)內(nèi)部各種圖像繪制操作都是以BMP格式為基礎(chǔ)的。一個典型的位圖文件由4個部分組成:位圖文件頭(bitmap-fileheader)、位圖信息頭(bitmap-informationheader)、色表(colortable)和實際位圖數(shù)據(jù)的字節(jié)陣列,其具體形式如下圖所示。其中前面3個部分包含關(guān)于這個圖形文件的信息,這不是我們這個程序討論的重點,不對其進(jìn)行詳細(xì)說明。只要我們了解到這3個部分占據(jù)了一個24位真彩色BMP位圖文件的前54個字節(jié)就可以了。位圖文件頭位圖信息頭色表實際位圖數(shù)據(jù)典型BMP文件結(jié)構(gòu)示意圖對于一個24位真彩色BMP位圖文件,其圖像上每個點的色彩分別由圖象文件“實際位圖數(shù)據(jù)”部分中的三個字節(jié),也就是24位來表示該點的RGB值,每個字節(jié)的值對應(yīng)一種組成混合光的基礎(chǔ)光(紅色、綠色、藍(lán)色)的強(qiáng)度。這一點非常類似于VB中的RGB函數(shù)。因此我們可以利用這類文件的這一特點來編寫以下程序。例13.624位真彩色位圖文件反色處理程序。要求該程序能夠?qū)⑦x中的24位真彩色位圖文件進(jìn)行圖像反色處理,所謂反色處理是指將每個點的顏色數(shù)據(jù)按位取反,即進(jìn)行顏色反相,其效果如左圖和右圖所示。原始圖像
經(jīng)過反色處理的圖像了解了圖像反色這一概念和24位真彩色文圖文件的格式后,我們就可以著手編寫程序了。首先,按照下圖所示添加窗體對象上的各個控件。程序中兩個命令按鈕對象的名稱屬性分別為Command1和Command2,然后按照圖中所示分別為兩個命令按鈕對象設(shè)定標(biāo)題屬性。圖中通用對話框?qū)ο蟮拿Q屬性為CommonDialog1。圖像反色處理程序設(shè)計窗體完成以上設(shè)定后為程序添加以下代碼:'***************************************'24位真彩色位圖文件,反色處理程序。'***************************************Dimdata()AsByte
PrivateSubForm_Load()CommonDialog1.Filter="位圖文件|*.bmp"Form1.AutoRedraw=TrueEndSub
PrivateSubCommand1_Click()CommonDialog1.ShowOpenIfCommonDialog1.FileName<>""ThenOpenCommonDialog1.FileNameForBinaryAs#1'以二進(jìn)制模式打開‘通用對話框所選擇的文件。length=LOF(1)ReDimdata(length)'根據(jù)打開的文件的長度,重定義動態(tài)數(shù)組data()Fori=1TolengthGet#1,i,data(i)'將二進(jìn)制文件中的每個字節(jié)的數(shù)據(jù),讀入到data()數(shù)組中去。Ifi>54Then'位圖文件的文件頭等格式數(shù)據(jù)總長度為54字節(jié),不能對'這部分?jǐn)?shù)據(jù)進(jìn)行取反操作。除文件頭等格式數(shù)據(jù)外,要對'該文件中所有數(shù)據(jù)進(jìn)行取反操作。data(i)=Notdata(i)Put#1,i,data(i)'將每一個字節(jié)的實際位圖數(shù)據(jù)進(jìn)行取反后,'重新寫入到1號文件。EndIfNextiPrintPrint"圖片文件反色處理完畢,"Print"請打開";CommonDialog1.FileName;"觀察效果。"Close#1EndIfEndSub
PrivateSubCommand2_Click()EndEndSub將以上代碼添加到程序后運行程序,選擇要對其進(jìn)行反色操作的位圖文件,然后再使用任何一種看圖工具打開該位圖文件,我們就可以看到該程序的運行效果了。13.6文件基本操作除了讀寫文件外,VisualBasic還提供了對文件進(jìn)行刪除、移動、復(fù)制和重命名等文件基本操作語句。13.6.1文件的刪除在VB中對文件進(jìn)行刪除操作是通過Kill語句來實現(xiàn)的,其格式如下:Kill"文件名"參數(shù)“文件名”是一個用來指定欲將其刪除的文件名字符串表達(dá)式。例如:由上面實例中第二個Kill語句我們可以看出,Kill語句支持多字符(*)和單字符(?)兩種通配符號來完成對文件操作。Kill語句具有一定的危險性,因為使用Kill語句對文件進(jìn)行刪除操作時,不會將文件移到計算機(jī)的垃圾箱中,而是將文件徹底從硬盤刪除掉。而且,在進(jìn)行刪除操作時不會給出任何提示,因此我們在程序中使用該語句時,一定要在刪除文件前給出一些提示信息。Kill"D:\VB\datal.dat"'刪除D盤VB目錄內(nèi)data1.dat文件。Kill"D:\VB\dat\*.*"'刪除D盤VB目錄內(nèi)所有文件。13.6.2文件的復(fù)制和移動在VisualBasic中,文件的復(fù)制操作是通過FileCopy語句來實現(xiàn)的,其格式如下:FileCopy"源文件","目標(biāo)文件"用FileCopy語句可以把源文件拷貝到目標(biāo)文件,拷貝后兩個文件的內(nèi)容完全一致。例如:將當(dāng)前目錄下的一個文件拷貝到同一目錄下的另一個文件。如果要將一個目錄下某一文件拷貝到另一個目錄下,則必須包括路徑信息,例如:使用FileCopy語句時,我們必須保證源文件的存在和目標(biāo)文件中路徑信息的正確,且FileCopy語句中不能使用通配符號(*或?)。此外,F(xiàn)ileCopy不能對已由VisualBasic打開的文件進(jìn)行復(fù)制操作。VB并沒有為我們提供專門的文件移動語句,但文件的移動操作其實可以分為以下兩步操作:(1)復(fù)制文件。(2)將源文件刪除。此外,用Name語句也可以實現(xiàn)文件的移動操作。FileCopy"source.doc","target.doc"FileCopy"c:\abc\source.doc","d:\xy\target.doc"13.6.3文件(目錄)重命名在VB中,文件的改名可以通過Name語句來實現(xiàn),其格式如下:Name"原文件名"As"新文件名"其中參數(shù)“原文件名”用來指定已經(jīng)存在的文件名和位置,可以包含目錄信息,“新文件名”參數(shù)用來指定改名后新的文件名和位置。值得注意的是,“新文件名”參數(shù)所指定的文件名不能是已經(jīng)存在的文件名,否則會產(chǎn)生錯誤。在Name語句的參數(shù)中也不能使用通配符號(*或?)。此外,如果“新文件名”參數(shù)和“原文件名”參數(shù)中文件的路徑信息不同,Name語句在改變文件名的同時還會對文件進(jìn)行移動操作。例如:PrivateSubForm_Load()Name"c:\a.wav"As"d:\abc.wav"EndSub該例中Name語句的作用是,將C:盤根目錄上的a.wav文件改名為abc.wav,然后將其移動到的D:盤根目錄上。另外,除了能夠改變某文件的名字外,Name語句還可以改變硬盤上某目錄的名稱。使用方法與對文件的操作一樣,不再贅述。但有一點需要注意,對目錄進(jìn)行改名操作時,不能像操作文件一樣進(jìn)行跨驅(qū)動器移動操作,否則產(chǎn)生錯誤。13.7文件系統(tǒng)控件文件系統(tǒng)控件包括驅(qū)動器列表框、目錄列表框和文件列表框。這三個列表框經(jīng)常結(jié)合起來使用。驅(qū)動器列表框是下拉式列表框,默認(rèn)時在用戶系統(tǒng)上顯示當(dāng)前驅(qū)動器。當(dāng)該控件獲得焦點時,用戶可以從中選擇任何有效的驅(qū)動器標(biāo)識符。目錄列表框從最高層目錄開始顯示用戶系統(tǒng)上的當(dāng)前驅(qū)動器目錄結(jié)構(gòu)。在列表中上下移動時將依次突出顯示每個目錄項。文件列表框在運行時顯示由Path屬性指定的包含在目錄中的文件。結(jié)合使用這三個控件和前面介紹的文件操作語句,可以編寫完善的文件管理程序。13.7.1驅(qū)動器列表框和目錄列表框驅(qū)動器列表框和目錄列表框都是下拉式列表框,在工具箱中的圖標(biāo)如下圖所示。驅(qū)動器列表框
目錄列表框1.驅(qū)動器列表框驅(qū)動器列表框及后面介紹的目錄列表框、文件列表框有許多標(biāo)準(zhǔn)屬性,包括Enabled、FontBold、FontItalic、FontName、Fontsize、Height、Left、Name、Top、Visible、Width。而這些屬性的作用都與其他一些控件基本類似,這里就不再贅述。此外,驅(qū)動器列表框還有一個Drive屬性,用來設(shè)置或返回所選擇的驅(qū)動器名。Drive屬性只能用程序代碼設(shè)置,不能通過屬性窗口設(shè)置。其格式為:例如:在程序執(zhí)行期間,驅(qū)動器列表框下拉顯示系統(tǒng)所擁有的所有可用驅(qū)動器名稱。在一般情況下,只顯示當(dāng)前的磁盤驅(qū)動器名稱。如果單擊列表框右端向下的箭頭,則把計算機(jī)所有的驅(qū)動器名稱全部在下拉列表中顯示出來,如圖13-15所示。單擊某個驅(qū)動器名,即可把它變?yōu)轵?qū)動器列表框?qū)ο蟮漠?dāng)前驅(qū)動器。同時還會觸發(fā)該驅(qū)動器列表框?qū)ο蟮腃hange事件。object.Drive=驅(qū)動器字符串Drive1.Drive="c:\"'Drive1是一個驅(qū)動器列表框?qū)ο蟮拿Q2.目錄列表框目錄列表框用來顯示當(dāng)前驅(qū)動器上的目錄結(jié)構(gòu)。剛建立時顯示當(dāng)前驅(qū)動器的頂層目錄和當(dāng)前目錄。頂層目錄用一個打開的文件夾表示,當(dāng)前目錄用一個加了陰影的文件夾來表示,當(dāng)前目錄下的子目錄用合著的文件夾來表示,如下圖所示。
運行時的驅(qū)動器列表控件
運行時的目錄列表控件目錄列表框常用屬性是Path,該屬性用來設(shè)置和返回目錄列表框中所顯示目錄的路徑。其語法如下:例如:在目錄列表框中,只能顯示當(dāng)前驅(qū)動器上的目錄。如果要顯示其他驅(qū)動器上的目錄,必須改變路徑,即重新設(shè)置目錄列表框的Path屬性。Path屬性只能在程序代碼中設(shè)置,不能在屬性窗口中設(shè)置。它的功能類似于DOS下的CD命令,用來改變目錄路徑。對目錄列表框來說,當(dāng)Path屬性值改變時,將引發(fā)其自身的Change事件。object.Path=路徑字符串
或
字符串變量=object.PathDir1.Path="C:\Windows"'Dir1是一個目錄列表框?qū)ο蟮拿QPrintDir1.Path例13.7
編制程序,要求程序中有一驅(qū)動器列表框?qū)ο蠛鸵粋€目錄列表框?qū)ο?,并且實現(xiàn)目錄列表框?qū)ο蠛万?qū)動器列表框?qū)ο蟮耐讲僮鳌F洚嬅嫒缦聢D所示。驅(qū)動器列表框和目錄列表框同步程序向窗體對象上添加上各個控件后,分別將其命名為Drive1(驅(qū)動器列表框?qū)ο螅┖虳ir1(目錄列表框?qū)ο螅?,然后添加以下代碼:上面代碼的作用是,在驅(qū)動器列表框?qū)ο驞rive1發(fā)生變化時(如:選擇了一個新的硬盤盤符),將目錄列表框?qū)ο驞ir1的Path屬性設(shè)置為Drive1對象的Drive屬性,從而實現(xiàn)兩控件的同步操作。即在改變Drive1對象盤符的同時,也改變了目錄列表框?qū)ο蟮穆窂?。PrivateSubDrive1_Change()Dir1.Path=Drive1.DriveEndSub13.7.2文件列表框用驅(qū)動器列表框和目錄列表框可以指定當(dāng)前驅(qū)動器和當(dāng)前目錄,而文件列表框可以用來顯示當(dāng)前目錄下的文件(可以通過Path屬性改變)。文件列表框的默認(rèn)控件名是File1。在工具箱中,文件列表框的圖標(biāo)為
。1.文件列表框控件的屬性與文件列表框有關(guān)的屬性較多,介紹如下。(1)Path屬性該屬用來設(shè)置文件列表框中所顯示文件所在目錄的路徑,其作用和目錄列表框?qū)ο蠡鞠嗤梅ㄒ蚕嗤?,主要是用來使其能夠和目錄列表框?qū)ο筮M(jìn)行同步操作。(2)Pattern屬性Pattern屬性用來設(shè)置在執(zhí)行時要顯示的某一種類型的文件,它可以在設(shè)計階段用屬性窗口設(shè)置,也可以通過程序代碼設(shè)置。在默認(rèn)情況下,Pattern的屬性值為*.*,即所有文件。在設(shè)計階段,建立了文件列表框后,查看屬性窗口中的Pattern屬性,可以發(fā)現(xiàn)其默認(rèn)值為*.*。如果把它改為*.TXT,則在執(zhí)行時文件列表框中顯示的是*.TXT文件。在程序代碼中設(shè)置Pattern的格式如下:在窗體上畫一個文件列表框,在屬性窗口中把它的Pattern屬性設(shè)置為*.exe,則文件列表框中只顯示擴(kuò)展名為.exe的文件,如圖13-18所示。文件列表框?qū)ο竺?Pattern=屬性值文件列表框?qū)ο蠛退腜attern屬性(3)FileName屬性FileName屬性用來返回在文件列表框中某一被選定的文件名稱。(4)ListCount屬性ListCount屬性可用于組合框,也可用于驅(qū)動器列表框、目錄列表框及文件列表框。其格式為:這里的“控件”可以是組合框、目錄列表框、驅(qū)動器列表框或文件列表框。ListCount屬性返回控件內(nèi)所列項目的總數(shù)。該屬性不能在屬性窗口中設(shè)置,只能在程序代碼中使用。(5)ListIndex屬性這里的“控件”可以是組合框、列表框、驅(qū)動器列表框、目錄列表框或文件列表框,用來設(shè)置或返回當(dāng)前控件上所選擇的項目的“索引值”(即下標(biāo))。該屬性只能在程序代碼中使用,不能通過屬性窗口設(shè)置。在文件列表框中,第一項的索引值為0,第二項為1,依次類推。如果沒有選中任何項,則ListIndex屬性的值將被設(shè)置為-1??丶?ListCount控件.ListIndex[=索引值](6)List屬性控件.List(索引)[=字符串表達(dá)式]這里的“控件”可以是組合框、列表框、驅(qū)動器列表框、目錄列表框或文件列表框。在List屬性中存有文件列表框中所有項目的數(shù)組,可用來設(shè)置或返回各種列表框中的某一項目。格式中的“索引”是某種列表框中項目的下標(biāo)(從0開始)。例如:該例用List屬性來輸出目錄列表框中的所有項目。循環(huán)終值Dir1.ListCount指的是目錄列表框中的項目總數(shù),而Dir1.List(i)指的是每一個項目。Fori=0ToDir1.ListCountPrintDir1.List(i)Nexti再如:該例用For循環(huán)輸出文件列表框File1中的所有項目。Fi1e1.ListCount表示列表框中所有文件的總數(shù),F(xiàn)ile1.List(i)指的是每個文件名。再如:第一個語句用來輸出文件列表框中某一被選項目的索引值(下標(biāo))。第二個語句顯示以該索引值為下標(biāo)的項目名稱。Fori=0ToFile1.ListCountPrintFile1.List(i)NextiPrintFile1.ListIndexPrintFile1.List(File1.ListIndex)2.驅(qū)動器列表框目錄列表框文件列表框的同步操作在實際應(yīng)用中,驅(qū)動器列表框、目錄列表框和文件列表框往往需要同步操作,這可以通過Path屬性的改變引發(fā)Change事件來實現(xiàn)。例如:該事件過程使窗體上的目錄列表框Dir1和文件列表框File1產(chǎn)生同步。因為目錄列表框Path屬性的改變將產(chǎn)生Change事件,所以在DirLChange事件過程中把Dir1.Path賦給File1.Path,就可以產(chǎn)生同步效果。PrivateSubDir1_change()File1.Path=Dir1.PathEndSub類似地,增加下面的事件過程,就可以使3種列表框同步操作:該過程使驅(qū)動器列表框和目錄列表框同步,前面的過程使目錄列表框和文件列表框同步,從而使3種列表框同步。PrivateSubDrivel_Change()Dir1.Path=Drivel.DriveEndSub13.8文件綜合上機(jī)練習(xí)題學(xué)習(xí)了關(guān)于文件操作的相關(guān)知識,讓我們一起來編制一個復(fù)雜一些的程序。該程序能夠?qū)崿F(xiàn)對一個學(xué)生檔案數(shù)據(jù)文件的管理。當(dāng)然,該程序并不是十分完善,而且在某些操作中或許還存在著一些漏洞,但是編制該程序的目的是為了讓讀者們自己動手試驗一下關(guān)于文件操作的編程手段。故希望讀者一定要自己動手實驗一下。例13.8
設(shè)計一個窗體,用于實現(xiàn)學(xué)生記錄的基本操作,其屏幕設(shè)計如右圖所示。性別用選項鈕,民族用組合框。設(shè)計階段例13.8的窗體界面要求:(1)實現(xiàn)學(xué)生記錄的翻閱查詢。(2)實現(xiàn)學(xué)生記錄的輸入。(3)實現(xiàn)學(xué)生記錄的修改。(4)在輸入和修改時提供可放棄的功能。(5)所有輸入的記錄要存儲在文件中。該窗體中放置了兩個圖片框(Picture1和Picture2)、一個框架Frame1。這三個控件的作用一樣,都是作其他控件的容器來使用。除此之外,還有一個命令按鈕Exit。在框架Frame1中放置6個標(biāo)簽(使用Label1控件數(shù)組)、4個文本框(其名稱為txtNo、txtName、txtKh和txtClass,分別對應(yīng)學(xué)號、姓名、準(zhǔn)考證號和班號字段)、2個選項鈕(使用optSex控件數(shù)組,用于輸入性別)和1個組合框(名稱為comMz,用于輸入民族)。在圖片框Picture1中放置7個命令按鈕(名稱分別為Tp、Prev、Nex、Bott、Add和Upd,分別實現(xiàn)顯示第一個記錄、上一個記錄、下一個記錄、最后一個記錄、添加一個記錄和修改當(dāng)前記錄的功能)。當(dāng)執(zhí)行Picture1.Visible=False語句后,其中的所有命令按鈕都不可見,當(dāng)執(zhí)行Picture1.Visible=True語句后,其中的所有命令按鈕都可見。這就是為什么在這里使用圖片框的原因。在圖片框Picture2中放置2個命令按鈕(名稱分別為Ok、Cancel,分別實現(xiàn)記錄添加、修改和刪除操作的確定與取消功能)。同樣,當(dāng)執(zhí)行Picture2.Visible=False語句后,其中的所有命令按鈕都不可見,當(dāng)執(zhí)行Picture2.Visible=True語句后,其中的所有命令按鈕都可見。在本窗體上設(shè)計如下事件過程:'定義類型PrivateTypeStudTypeNoAsIntegerNameAsString*10SexAsBooleanKhAsString*10MzAsString*12ClassAsString*5EndType
DimstudentAsStudTypeDimRecsAsInteger '文件中記錄總個數(shù)DimCurNoAsInteger '當(dāng)前記錄號DimOpAsInteger ‘操作類型PrivateSubExit_Click()CloseEndEndSub
PrivateSubForm_Load()Picture2.Visible=FalseOpen"student.dat"ForRandomAs#1Len=Len(student)'計算原來文件中的記錄個數(shù)Recs=LOF(1)/Len(student)IfRecs>0Then '原來文件中有記錄時CurNo=1BEnabled(True)DispRecElse'原來文件中無記錄時
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 2024版設(shè)備采購合同合同范本
- 二零二五年度集裝箱租賃與貨運服務(wù)合同3篇
- 二零二五版房屋租賃期限合同全新范本9篇
- 二零二五年度高管勞動合同示范文本:股權(quán)激勵與績效獎金3篇
- 二零二五版民辦學(xué)校校長任期學(xué)校社區(qū)服務(wù)聘用合同4篇
- 二零二五年度大客車租賃合同車輛使用規(guī)范范本4篇
- 二零二五版藝術(shù)品擔(dān)保合同范本解析3篇
- 2025年度磷礦石資源整合與開發(fā)服務(wù)合同4篇
- 2025年度門樓建筑垃圾處理與環(huán)保施工合同4篇
- 二零二五年度綠色家居產(chǎn)品代售合同協(xié)議書4篇
- 腰椎間盤突出疑難病例討論
- 《光伏發(fā)電工程工程量清單計價規(guī)范》
- 2023-2024學(xué)年度人教版四年級語文上冊寒假作業(yè)
- (完整版)保證藥品信息來源合法、真實、安全的管理措施、情況說明及相關(guān)證明
- 營銷專員績效考核指標(biāo)
- 陜西麟游風(fēng)電吊裝方案專家論證版
- 供應(yīng)商審核培訓(xùn)教程
- 【盒馬鮮生生鮮類產(chǎn)品配送服務(wù)問題及優(yōu)化建議分析10000字(論文)】
- 肝硬化心衰患者的護(hù)理查房課件
- 2023年四川省樂山市中考數(shù)學(xué)試卷
- 【可行性報告】2023年電動自行車行業(yè)項目可行性分析報告
評論
0/150
提交評論