版權(quán)說(shuō)明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
1、CString sql; sql="select * from ti where telnumber like '888' " CString sql; sql="select * from ti where telnumber
2、160; like '888%'" 忘記c語(yǔ)言用%代表%了嗎? vc用ado訪問(wèn)數(shù)據(jù)庫(kù)全攻略作者:相生昌 更新時(shí)間: 2005-05-07 關(guān)鍵字 ado訪問(wèn)數(shù)據(jù)庫(kù)大全原作者姓名 相生昌 介紹vc用ado訪問(wèn)數(shù)據(jù)庫(kù)全攻略,介紹了vc用ado來(lái)訪問(wèn)數(shù)據(jù)庫(kù)的各個(gè)對(duì)象及各方法,很經(jīng)典,也很實(shí)用,很值得一看。 讀者評(píng)分 10 評(píng)分次數(shù) 3 正文一、ado概述ado是microsoft為最新和最強(qiáng)大的數(shù)據(jù)訪問(wèn)范例 ole db 而設(shè)計(jì)的,是一個(gè)便于使用的應(yīng)用程序?qū)咏涌?。ado 使您能夠編寫(xiě)應(yīng)用程序以
3、通過(guò) ole. db 提供者訪問(wèn)和操作數(shù)據(jù)庫(kù)服務(wù)器中的數(shù)據(jù)。ado 最主要的優(yōu)點(diǎn)是易于使用、速度快、內(nèi)存支出少和磁盤(pán)遺跡小。ado 在關(guān)鍵的應(yīng)用方案中使用最少的網(wǎng)絡(luò)流量,并且在前端和數(shù)據(jù)源之間使用最少的層數(shù),所有這些都是為了提供輕量、高性能的接口。之所以稱為 ado,是用了一個(gè)比較熟悉的暗喻,ole 自動(dòng)化接口。ole db是一組”組件對(duì)象模型”(com) 接口,是新的數(shù)據(jù)庫(kù)低層接口,它封裝了odbc的功能,并以統(tǒng)一的方式訪問(wèn)存儲(chǔ)在不同信息源中的數(shù)據(jù)。ole db是microsoft uda(universal data access)策略的技術(shù)基礎(chǔ)。ole db 為任何數(shù)據(jù)源提供了高性能的訪
4、問(wèn),這些數(shù)據(jù)源包括關(guān)系和非關(guān)系數(shù)據(jù)庫(kù)、電子郵件和文件系統(tǒng)、文本和圖形、自定義業(yè)務(wù)對(duì)象等等。也就是說(shuō),ole db 并不局限于 isam、jet 甚至關(guān)系數(shù)據(jù)源,它能夠處理任何類型的數(shù)據(jù),而不考慮它們的格式和存儲(chǔ)方法。在實(shí)際應(yīng)用中,這種多樣性意味著可以訪問(wèn)駐留在 excel 電子數(shù)據(jù)表、文本文件、電子郵件/目錄服務(wù)甚至郵件服務(wù)器,諸如 microsoft exchange 中的數(shù)據(jù)。但是,ole db 應(yīng)用程序編程接口的目的是為各種應(yīng)用程序提供最佳的功能,它并不符合簡(jiǎn)單化的要求。您需要的api 應(yīng)該是一座連接應(yīng)用程序和ole db 的橋梁,這就是 activex data objects (ad
5、o)。 二、在vc中使用ado(開(kāi)發(fā)步驟好下:) 1、引入ado庫(kù)文件 使用ado前必須在工程的stdafx.h頭文件里用直接引入符號(hào)#import引入ado庫(kù)文件,以使編譯器能正確編譯。代碼如下所示: 用#import引入ado庫(kù)文件#import "c:program filescommon filessystemadomsado15.dll"no_namespaces rename("eof" adoeof")這行語(yǔ)句聲明在工程中使用ado,但不使用ado的名字空間,并且為了避免常數(shù)沖突,將常數(shù)eof改名為adoeof。現(xiàn)在不需添加另外的
6、頭文件,就可以使用ado接口了。 2、初始化ole/com庫(kù)環(huán)境必須注意的是,ado庫(kù)是一組com動(dòng)態(tài)庫(kù),這意味應(yīng)用程序在調(diào)用ado前,必須初始化ole/com庫(kù)環(huán)境。在mfc應(yīng)用程序里,一個(gè)比較好的方法是在應(yīng)用程序主類的initinstance成員函數(shù)里初始化ole/com庫(kù)環(huán)境。bool cmyadotestapp:initinstance()if(!afxoleinit()/這就是初始化com庫(kù)afxmessagebox(“ole初始化出錯(cuò)!”);return false; 3、ado接口簡(jiǎn)介 ado庫(kù)包含三個(gè)基本接口:_connectionptr接口、_commandptr接口和_re
7、cordsetptr接口。_connectionptr接口返回一個(gè)記錄集或一個(gè)空指針。通常使用它來(lái)創(chuàng)建一個(gè)數(shù)據(jù)連接或執(zhí)行一條不返回任何結(jié)果的sql語(yǔ)句,如一個(gè)存儲(chǔ)過(guò)程。使用_connectionptr接口返回一個(gè)記錄集不是一個(gè)好的使用方法。對(duì)于要返回記錄的操作通常用_recordserptr來(lái)實(shí)現(xiàn)。而用_connectionptr操作時(shí)要想得到記錄條數(shù)得遍歷所有記錄,而用_recordserptr時(shí)不需要。 _commandptr接口返回一個(gè)記錄集。它提供了一種簡(jiǎn)單的方法來(lái)執(zhí)行返回記錄集的存儲(chǔ)過(guò)程和sql語(yǔ)句。在使用_commandptr接口時(shí),你可以利用全局_connectionptr接口,
8、也可以在_commandptr接口里直接使用連接串。如果你只執(zhí)行一次或幾次數(shù)據(jù)訪問(wèn)操作,后者是比較好的選擇。但如果你要頻繁訪問(wèn)數(shù)據(jù)庫(kù),并要返回很多記錄集,那么,你應(yīng)該使用全局_connectionptr接口創(chuàng)建一個(gè)數(shù)據(jù)連接,然后使用_commandptr接口執(zhí)行存儲(chǔ)過(guò)程和sql語(yǔ)句。 _recordsetptr是一個(gè)記錄集對(duì)象。與以上兩種對(duì)象相比,它對(duì)記錄集提供了更多的控制功能,如記錄鎖定,游標(biāo)控制等。同_commandptr接口一樣,它不一定要使用一個(gè)已經(jīng)創(chuàng)建的數(shù)據(jù)連接,可以用一個(gè)連接串代替連接指針賦給_recordsetptr的connection成員變量,讓它自己創(chuàng)建數(shù)據(jù)連接。如果你要使
9、用多個(gè)記錄集,最好的方法是同command對(duì)象一樣使用已經(jīng)創(chuàng)建了數(shù)據(jù)連接的全局_connectionptr接口,然后使用_recordsetptr執(zhí)行存儲(chǔ)過(guò)程和sql語(yǔ)句。 4、使用_connectionptr接口_connectionptr主要是一個(gè)連接接口,取得與數(shù)據(jù)庫(kù)的連接。它的連接字符串可以是自己直接寫(xiě),也可以指向一個(gè)odbcdsn。_connectionptr pconn;if (failed(pconn.createinstance("adodb.connection")afxmessagebox("create instance failed!&qu
10、ot;);return;cstring strsrc;strsrc=" server;server="strsrc+="suppersoft"strsrc+="database="strsrc+="mydb"strsrc+="uid=sa;pwd="cstring strsql = "insert into student(no,name,sex,address) values(3,'aaa','male','beijing')"
11、;_variant_t varsrc(strsrc);_variant_t varsql(strsql);_bstr_t bstrsrc(strsrc);if (failed(pconn->open(bstrsrc,"","",-1)afxmessagebox("can not open database!");pconn.release();return;colevariant vtoptional(long)disp_e_paramnotfound,vt_error);pconn->execute(_bstr_t(st
12、rsql),!amp;vtoptional,-1);pconn.release();afxmessagebox("ok!");5、使用_recordsetptr接口(以連接sql server為例)_recordsetptr pptr;if (failed(pptr.createinstance("adodb.recordset")afxmessagebox("create instance failed!");return false;cstring strsrc;strsrc=" server;server="
13、strsrc+="210.46.141.145"strsrc+="database="strsrc+="mydb"strsrc+="uid=sa;pwd="strsrc+="sa"cstring strsql = "select id,name,gender,address from personal"_variant_t varsrc(strsrc);_variant_t varsql(strsql);if(failed(pptr->open(varsql,varsr
14、c,adopenstatic,adlockoptimistic,adcmdtext)afxmessagebox("open table failed!");pptr.release();return false;while(!pptr->getadoeof()_variant_t varno;_variant_t varname;_variant_t varsex;_variant_t varaddress;varno = pptr->getcollect ("id");varname = pptr->getcollect ("
15、;name");varsex = pptr->getcollect ("gender");varaddress = pptr->getcollect ("address");cstring strno =(char *)_bstr_t(varno);cstring strname =(char *)_bstr_t(varname);cstring strsex =(char *)_bstr_t(varsex);cstring straddress =(char *)_bstr_t(varaddress);strno.trimrigh
16、t();strname.trimright();strsex.trimright();straddress.trimright();int ncount = m_list.getitemcount();int nitem = m_list.insertitem (ncount,_t("");m_list.setitemtext (nitem,0,strno);m_list.setitemtext (nitem,1,strname);m_list.setitemtext (nitem,2,strsex);m_list.setitemtext (nitem,3,straddre
17、ss);pptr->movenext();pptr->close();pptr.release();6、使用_commandptr接口_commandptr接口返回一個(gè)recordset對(duì)象,并且提供了更多的記錄集控制功能,以下代碼示例了使用_commandptr接口的方法: 代碼11:使用_commandptr接口獲取數(shù)據(jù)_commandptr pcommand;_recordsetptr prs;pcommand.createinstance(_uuidof(command);pcommand->activeconnection=pconn;pcommand->co
18、mmandtext="select * from student"pcommand->commandtype=adcmdtext;pcommand->parameters->refresh();prs=pcommand->execute(null,null,adcmdunknown);_variant_t varvalue = prs->getcollect("name");cstring strvalue=(char*)_bstr_t(varvalue); 6、關(guān)于數(shù)據(jù)類型轉(zhuǎn)換由于com對(duì)象是跨平臺(tái)的,它使用了一種通用的方
19、法來(lái)處理各種類型的數(shù)據(jù),因此cstring 類和com對(duì)象是不兼容的,我們需要一組api來(lái)轉(zhuǎn)換com對(duì)象和c+類型的數(shù)據(jù)。_vatiant_t和_bstr_t就是這樣兩種對(duì)象。它們提供了通用的方法轉(zhuǎn)換com對(duì)象和c+類型的數(shù)據(jù)。vc中利用ado共同實(shí)現(xiàn)數(shù)據(jù)庫(kù)的操作作者:bull 更新時(shí)間: 2005-05-07 vc中利用ado共同實(shí)現(xiàn)數(shù)據(jù)庫(kù)的操作 ado是應(yīng)用層的編程接口,它通過(guò)ole db提供的com接口訪問(wèn)數(shù)據(jù),它適合于各種客戶機(jī)/服務(wù)器應(yīng)用系統(tǒng)和基于web的應(yīng)用,尤其在一些腳本語(yǔ)言中訪問(wèn)數(shù)據(jù)庫(kù)操作是ado的主要優(yōu)勢(shì)。ado是一套用自動(dòng)化技術(shù)建立起來(lái)的對(duì)象層次結(jié)
20、構(gòu),它比其他的一些對(duì)象模型如dao(data access object)、rdo(remote data object)等具有更好的靈活性,使用更為方便,并且訪問(wèn)數(shù)據(jù)的效率更高。sql是強(qiáng)大的數(shù)據(jù)庫(kù)操作系統(tǒng),通過(guò)ado和sql語(yǔ)句的配合,我們可以的實(shí)現(xiàn)對(duì)數(shù)據(jù)庫(kù)的一系列操作,例如創(chuàng)建數(shù)據(jù)庫(kù)、創(chuàng)建表、創(chuàng)建索引,實(shí)現(xiàn)數(shù)據(jù)庫(kù)的多重查詢、高級(jí)查詢和數(shù)據(jù)的匯總等技術(shù)。下面通過(guò)例程介紹如何通過(guò)ado和sql語(yǔ)句的配合實(shí)現(xiàn)對(duì)數(shù)據(jù)庫(kù)的操作。 第一步:通過(guò)access創(chuàng)建數(shù)據(jù)庫(kù)test.mdb。 第二步:創(chuàng)建單文檔工程testado,所有的選項(xiàng)都取默認(rèn)值。 第三步:com庫(kù)的初始化 我們可以使用afxolein
21、it()來(lái)初始化com庫(kù),這項(xiàng)工作通常在cwinapp:initinstance()的重載函數(shù)中完成,請(qǐng)看如下代碼: bool cadotest1app:initinstance() afxoleinit(); . 第四步:用#import指令引入ado類型庫(kù) 我們?cè)趕tdafx.h中加入如下語(yǔ)句: #import "c:program filescommon filessystemadomsado15.dll" no_namespace rename("eof","adoeof") 這一語(yǔ)句有何作用呢?其最終作用同我們熟悉的#inc
22、lude類似,編譯的時(shí)候系統(tǒng)會(huì)為我們生成msado15.tlh,ado15.tli兩個(gè)c+頭文件來(lái)定義ado庫(kù)。 第五步:在testadoview.h中定義一個(gè)指向connection對(duì)象的指針:_connectionptr _pconnection; 第六步:添加如下代碼: void ctestadoview:oninitialupdate() cview:oninitialupdate(); hresult hr; try hr = m_pconnection.createinstance("adodb.connection");/創(chuàng)建connection對(duì)象 if(s
23、ucceeded(hr) hr = m_pconnection->open("provider=microsoft.jet.oledb.4.0;data source=test.mdb","","",admodeunknown);/連接數(shù)據(jù)庫(kù) /上面一句中連接字串中的provider是針對(duì)access2000環(huán)境的,對(duì)于access97,需要改為:provider=microsoft.jet.oledb.3.51; catch(_com_error e)/捕捉異常 cstring errormessage; errormessa
24、ge.format("連接數(shù)據(jù)庫(kù)失敗!rn錯(cuò)誤信息:%s",e.errormessage(); afxmessagebox(errormessage);/顯示錯(cuò)誤信息 第七步:在析構(gòu)函數(shù)中關(guān)閉connection對(duì)象并將其釋放,代碼如下: ctestadoview:ctestadoview() m_pconnection->close(); m_pconnection.release(); 第八步:添加菜單項(xiàng)"創(chuàng)建數(shù)據(jù)庫(kù)表",并添加相應(yīng)的消息處理函數(shù),然后添加代碼如下: void ctestadoview:onaddtable() _variant
25、_t recordsaffected; m_pconnection->execute("create table new(id integer,username text,old integer)",!amp;recordsaffected,adcmdtext); 運(yùn)行程序,執(zhí)行菜單當(dāng)中的命令"添加表",我們可以發(fā)現(xiàn)數(shù)據(jù)庫(kù)中已經(jīng)添加了一個(gè)表new,其中的字段有我們定義的字段。 第九步:添加菜單項(xiàng)"刪除數(shù)據(jù)庫(kù)表",并添加相應(yīng)的消息處理函數(shù),然后添加代碼如下: void ctestadoview:ondeletetable() _v
26、ariant_t recordsaffected; m_pconnection->execute("drop table new",!amp;recordsaffected,adcmdtext); 運(yùn)行程序,執(zhí)行菜單當(dāng)中的命令"刪除表",我們可以發(fā)現(xiàn)數(shù)據(jù)庫(kù)中剛才添加的表new已被刪除。 第十步:添加菜單項(xiàng)"添加一列",并添加相應(yīng)的消息處理函數(shù),然后添加代碼如下: void ctestadoview:onaddcolumn() _variant_t recordsaffected; m_pconnection->execut
27、e("alter table new add newcolumn1 integer",!amp;recordsaffected,adcmdtext); 運(yùn)行程序,執(zhí)行菜單當(dāng)中的命令"添加一列",我們可以發(fā)現(xiàn)數(shù)據(jù)庫(kù)中剛才添加的表new中已添加了一個(gè)新列。 第十一步:添加菜單項(xiàng)"刪除一列",并添加相應(yīng)的消息處理函數(shù),然后添加代碼如下: void ctestadoview:onaddcolumn() _variant_t recordsaffected; m_pconnection->execute("alter table
28、 new add newcolumn1 integer",!amp;recordsaffected,adcmdtext); 運(yùn)行程序,執(zhí)行菜單當(dāng)中的命令"刪除一列",我們可以發(fā)現(xiàn)數(shù)據(jù)庫(kù)中剛才添加的表new中的新列已被刪除。 第十二步:添加菜單項(xiàng)"添加記錄",并添加相應(yīng)的消息處理函數(shù),然后添加代碼如下: void ctestadoview:onaddrecord() _variant_t recordsaffected; for(int i = 1;i < 10; i +) cstring strsql; strsql.format(&qu
29、ot;insert into new(id,username,old) values (%d, 'washington',%d)",i,i*9); m_pconnection->execute(_bstr_t)strsql,!amp;recordsaffected,adcmdtext); 運(yùn)行程序,執(zhí)行菜單當(dāng)中的命令"添加記錄",我們可以發(fā)現(xiàn)數(shù)據(jù)庫(kù)中剛才添加的表new中添加了九條新的記錄。 第十三步:添加菜單項(xiàng)"old字段加1",并添加相應(yīng)的消息處理函數(shù),然后添加代碼如下: void ctestadoview:onolda
30、ddone() _variant_t recordsaffected; m_pconnection->execute("update new set old = old+1",!amp;recordsaffected,adcmdtext); 運(yùn)行程序,執(zhí)行菜單當(dāng)中的命令"old記錄加1",我們可以發(fā)現(xiàn)數(shù)據(jù)庫(kù)中剛才添加的表new中的九條新的記錄的old字段都自動(dòng)加1。 第十四步:添加菜單項(xiàng)"統(tǒng)計(jì)記錄數(shù)目",并添加相應(yīng)的消息處理函數(shù),然后添加代碼如下: void ctestadoview:ontotalrecords() _reco
31、rdsetptr m_precordset; _variant_t recordsaffected; m_precordset =m_pconnection->execute("select count(*) from new where id > 0",!amp;recordsaffected,adcmdtext); _variant_t vindex = (long)0; _variant_t vcount = m_precordset->getcollect(vindex); /取得第一個(gè)字段的值放入vcount變量 m_precordset->
32、;close();/關(guān)閉記錄集 cstring message; message.format("共有%d條記錄",vcount.lval); afxmessagebox(message);/顯示當(dāng)前記錄條數(shù) 運(yùn)行程序,執(zhí)行菜單當(dāng)中的命令"統(tǒng)計(jì)記錄數(shù)目",我們可以得到數(shù)據(jù)庫(kù)中記錄的數(shù)目。 第十五步:添加菜單項(xiàng)"設(shè)置id為索引",并添加相應(yīng)的消息處理函數(shù),然后添加代碼如下: void ctestadoview:onsetidindex() _variant_t recordsaffected; m_pconnection->exe
33、cute("create unique index id on new(id)",!amp;recordsaffected,adcmdtext); 運(yùn)行程序,執(zhí)行菜單當(dāng)中的命令"設(shè)置id為索引",我們可以發(fā)現(xiàn)數(shù)據(jù)庫(kù)中id被設(shè)置為索引。 第十六步:添加菜單項(xiàng)"數(shù)據(jù)匯總"、"old字段的總和"、"old字段的均值"、"old的最小值"、"old字段的最大值",并添加相應(yīng)的消息處理函數(shù),然后添加代碼如下: void ctestadoview:onoldmax()
34、 _recordsetptr m_precordset; _variant_t recordsaffected; m_precordset =m_pconnection->execute("select max(old) from new",!amp;recordsaffected,adcmdtext); _variant_t vindex = (long)0; _variant_t vcount = m_precordset->getcollect(vindex); /取得第一個(gè)字段的值放入vcount變量 m_precordset->close();/
35、關(guān)閉記錄集 m_precordset.release(); cstring message; message.format("最大值是%d",vcount.lval); afxmessagebox(message); void ctestadoview:onoldmin() _recordsetptr m_precordset; _variant_t recordsaffected; m_precordset =m_pconnection->execute("select min(old) from new",!amp;recordsaffecte
36、d,adcmdtext); _variant_t vindex = (long)0; _variant_t vcount = m_precordset->getcollect(vindex); /取得第一個(gè)字段的值放入vcount變量 m_precordset->close();/關(guān)閉記錄集 m_precordset.release(); cstring message; message.format("最小值是%d",vcount.lval); afxmessagebox(message); void ctestadoview:onoldtotal() _re
37、cordsetptr m_precordset; _variant_t recordsaffected; m_precordset =m_pconnection->execute("select sum(old) from new",!amp;recordsaffected,adcmdtext); _variant_t vindex = (long)0; _variant_t vcount = m_precordset->getcollect(vindex); /取得第一個(gè)字段的值放入vcount變量 m_precordset->close();/關(guān)閉記錄
38、集 m_precordset.release(); cstring message; message.format("總和是%d",(long)vcount); afxmessagebox(message); void ctestadoview:onoldaverage() _recordsetptr m_precordset; _variant_t recordsaffected; m_precordset =m_pconnection->execute("select avg(old) from new",!amp;recordsaffecte
39、d,adcmdtext); _variant_t vindex = (long)0; _variant_t vcount = m_precordset->getcollect(vindex); /取得第一個(gè)字段的值放入vcount變量 m_precordset->close();/關(guān)閉記錄集 m_precordset.release(); cstring message; message.format("平均值是%d",(long)vcount); afxmessagebox(message); VC中的文件操作關(guān)鍵詞: VC 文件 &
40、#160; VC中的文件操作在VC編程中,操作文件的方法主要有兩種:利用API函數(shù)和MFC的CFile類。微軟在其中封裝了文件的一
41、般操作,下面我就介紹一下如何利用這兩種方法實(shí)現(xiàn)文件操作。1創(chuàng)建或打開(kāi)一個(gè)文件 API函數(shù)CreateFile可打開(kāi)和創(chuàng)建文件、管道、郵槽、通信服務(wù)、設(shè)備以及控制臺(tái),但是在此時(shí)只是介紹用這個(gè)函數(shù)怎么實(shí)現(xiàn)創(chuàng)建和打開(kāi)一個(gè)文件。HANDLE CreateFile(LPCTSTR lpFileName, / 要打開(kāi)的文件名DWORD dwDesiredAccess, / 文件的操作屬性DWORD dwShareMode, / 文件共享屬性 LPSECURITY_ATTRIBUTES lpSecurityAttributes,/ 文件安全特性DWORD dwCreationDisposition, /文件
42、操作DWORD dwFlagsAndAttributes, / 文件屬性HANDLE hTemplateFile / 如果不為零,則指定一個(gè)文件句柄。新文件將從這個(gè)文件中復(fù)制擴(kuò)展屬性 );文件的操作屬性:如果為零,表示只允許獲取與一個(gè)設(shè)備有關(guān)的信息,GENERIC_READ 表示允許對(duì)設(shè)備進(jìn)行讀訪問(wèn);如果為 GENERIC_WRITE 表示允許對(duì)設(shè)備進(jìn)行寫(xiě)訪問(wèn)(可組合使用);文件的共享屬性:零表示不共享; FILE_SHARE_READ 或 FILE_SHARE_WRITE 表示允許對(duì)文件進(jìn)行讀/寫(xiě)共享訪問(wèn);文件的操作有:·CREATE_NEW:創(chuàng)建文件;如文件存在則會(huì)出錯(cuò)·
43、;CREATE_ALWAYS:創(chuàng)建文件,會(huì)改寫(xiě)前一個(gè)文件·OPEN_EXISTING:文件必須已經(jīng)存在。由設(shè)備提出要求·OPEN_ALWAYS:如文件不存在則創(chuàng)建它·TRUNCATE_EXISTING:將現(xiàn)有文件縮短為零長(zhǎng)度文件屬性有:·FILE_ATTRIBUTE_ARCHIVE:標(biāo)記歸檔屬性·FILE_ATTRIBUTE_COMPRESSED:將文件標(biāo)記為已壓縮,或者標(biāo)記為文件在目錄中的默認(rèn)壓縮方式·FILE_ATTRIBUTE_NORMAL:默認(rèn)屬性·FILE_ATTRIBUTE_HIDDEN:隱藏文件或目錄·
44、;FILE_ATTRIBUTE_READONLY:文件為只讀·FILE_ATTRIBUTE_SYSTEM:文件為系統(tǒng)文件·FILE_FLAG_WRITE_THROUGH:操作系統(tǒng)不得推遲對(duì)文件的寫(xiě)操作·FILE_FLAG_OVERLAPPED:允許對(duì)文件進(jìn)行重疊操作·FILE_FLAG_NO_BUFFERING:禁止對(duì)文件進(jìn)行緩沖處理。文件只能寫(xiě)入磁盤(pán)卷的扇區(qū)塊·FILE_FLAG_RANDOM_ACCESS:針對(duì)隨機(jī)訪問(wèn)對(duì)文件緩沖進(jìn)行優(yōu)化·FILE_FLAG_SEQUENTIAL_SCAN:針對(duì)連續(xù)訪問(wèn)對(duì)文件緩沖進(jìn)行優(yōu)化·
45、FILE_FLAG_DELETE_ON_CLOSE:關(guān)閉了上一次打開(kāi)的句柄后,將文件刪除。特別適合臨時(shí)文件可以組合的屬性有:FILE_FLAG_WRITE_THROUGH,F(xiàn)ILE_FLAG_OVERLAPPED,F(xiàn)ILE_FLAG_NO_BUFFERING,F(xiàn)ILE_FLAG_RANDOM_ACCESS,F(xiàn)ILE_FLAG_SEQUENTIAL_SCAN,F(xiàn)ILE_FLAG_DELETE_ON_CLOSE,F(xiàn)ILE_FLAG_BACKUP_SEMANTICS,F(xiàn)ILE_FLAG_POSIX_SEMANTICS,F(xiàn)ILE_FLAG_OPEN_REPARSE_POINT,F(xiàn)ILE_FLAG_OP
46、EN_NO_RECALL如果成功返回一個(gè)打開(kāi)文件得句柄,如果調(diào)用函數(shù)之前文件存在,文件操作屬性為:CREATE_ALWAYS 或 OPEN_ALWAYS,使用GetLastError函數(shù)返回的是ERROR_ALREADY_EXISTS(包括函數(shù)操作成功),如果之前函數(shù)不存在,則返回0。使用失敗返回INVALID_HANDLE_VALUE,要取得更多的信息,使用GetLastError函數(shù)。文件關(guān)閉用:BOOL CloseHandle(HANDLE hObject / handle to object to close);例子1、在當(dāng)前目錄下面創(chuàng)建一個(gè)文件:HANDLE handle;DWORD
47、 Num;handle= :CreateFile("new.tmp",GENERIC_READ|GENERIC_WRITE,0,NULL,OPEN_ALWAYS,FILE_FLAG_DELETE_ON_CLOSE,NULL);if(INVALID_HANDLE_VALUE!= handle ):SetFilePointer(handle,0,0,FILE_BEGIN);char Buffer = "這是個(gè)剛創(chuàng)建的文件":WriteFile(handle,Buffer,sizeof(Buffer),&Num,NULL);ZeroMemory(Buf
48、fer,sizeof(Buffer);:SetFilePointer(handle,0,0,FILE_BEGIN);:ReadFile(handle,Buffer,sizeof(Buffer),&Num,NULL);MessageBox(Buffer);:CloseHandle(handle); 可以改變上面的創(chuàng)建文件的屬性和操作看下不同效果。CFile創(chuàng)建和打開(kāi)一個(gè)文件:創(chuàng)建文件和打開(kāi)文件的方法有很多種,下面簡(jiǎn)單介紹下幾個(gè)構(gòu)造函數(shù):CFile( LPCTSTR lpszFileName, UINT nOpenFlags );throw( CFileException );CFile(
49、 );BOOL Open( LPCTSTR lpszFileName, UINT nOpenFlags, CFileException* pError = NULL );lpszFileName:文件名稱,可以是相對(duì)路徑,絕對(duì)路徑或網(wǎng)絡(luò)路徑nOpenFlags:打開(kāi)方式有:·CFile:modeCreate 調(diào)用構(gòu)造函數(shù)構(gòu)造一個(gè)新文件,如果文件已存在,則長(zhǎng)度變成0。·CFile:modeNoTruncate 此值與modeCreate組合使用。如果所創(chuàng)建的文件已存在則其長(zhǎng)度不變?yōu)?。因而此文件被打開(kāi),或者作為一個(gè)新文件或者作為一個(gè)已存在的文件。這將是很有用的,例如當(dāng)打開(kāi)一個(gè)
50、可能存在也可能不存在的文件時(shí)。·CFile:modeRead 打開(kāi)文件僅供讀。·CFile:modeReadWrite 打開(kāi)文件供讀寫(xiě)。·CFile:modeWrite 打開(kāi)文件僅供寫(xiě)。·CFile:modeNoInherit 阻止文件被子進(jìn)程繼承。·CFile:ShareDenyNone 不禁止其它進(jìn)程讀或?qū)懺L問(wèn),打開(kāi)文件。如果文件已被其它進(jìn)程以兼容模式打開(kāi),則Create失敗。·CFile:ShareDenyRead 打開(kāi)文件,禁止其它進(jìn)程讀此文件。如果文件已被其它進(jìn)程以兼容模式打開(kāi),或被其它進(jìn)程讀,則Create失敗。·
51、;CFile:ShareDenyWrite 打開(kāi)文件,禁止其它進(jìn)程寫(xiě)此文件。如果文件已被其它進(jìn)程以兼容模式打開(kāi),或被其它進(jìn)程寫(xiě),則Create失敗。·CFile:ShareExclusive 以獨(dú)占模式打開(kāi)文件,禁止其它進(jìn)程對(duì)文件的讀寫(xiě)。如果文件已經(jīng)以其它模式打開(kāi)讀寫(xiě)(即使被當(dāng)前進(jìn)程),則構(gòu)造失敗。·CFile:ShareCompat 此標(biāo)志在32位MFC中無(wú)效。此標(biāo)志在使用CFile: Open時(shí)映射為CFile:ShareExclusive。·CFile:typeText 對(duì)回車(chē)換行設(shè)置特殊進(jìn)程(僅用于派生類)。·CFile:typeBinary 設(shè)
52、置二進(jìn)制模式(僅用于派生類)。下面給出MSDN中的一個(gè)例子:char* pFileName = "test.dat"TRYCFile f( pFileName, CFile:modeCreate | CFile:modeWrite );CATCH( CFileException, e )#ifdef _DEBUGafxDump << "File could not be opened " << e->m_cause << "n"#endifEND_CATCH CFile fileTest;ch
53、ar* pFileName = "test.dat"TRYfileTest.Open(pFileName, CFile:modeCreate |CFile:modeWrite);CATCH_ALL(e)fileTest.Abort( );THROW_LAST ( );END_CATCH_ALL2文件的讀寫(xiě)定位定位文件中的數(shù)據(jù)是很重要的,這決定了寫(xiě)入的數(shù)據(jù)在文件中的位置。API函數(shù)DWORD SetFilePointer(HANDLE hFile, /文件的句柄LONG lDistanceToMove, /字節(jié)偏移量rPLONG lpDistanceToMoveHigh, /
54、指定一個(gè)長(zhǎng)整數(shù)變量,其中包含了要使用的一個(gè)高雙字偏移(一般用來(lái)操作大型文件)??稍O(shè)為零,表示只使用lDistanceToMove DWORD dwMoveMethod /文件定位);dwMoveMethod文件定位的方式有三種:·FILE_BEGIN:從文件開(kāi)始處。·FILE_CURRENT:從當(dāng)前位置。·FILE_END:從文件的末尾。此函數(shù)可以用來(lái)定位大型文件,lpDistanceToMoveHigh是高32位,lDistanceToMove是低32位。如果lpDistanceToMoveHigh為NULL時(shí),函數(shù)操作成功,返回的是當(dāng)前文件數(shù)據(jù)的偏移量,如果l
55、pDistanceToMoveHigh不NULL,則返回?cái)?shù)據(jù)的偏移量高32位放在 lpDistanceToMoveHigh中,函數(shù)調(diào)用失敗返回的是0xffffffff.BOOL SetEndOfFile(HANDLE hFile /文件的句柄);CFile類的文件數(shù)據(jù)定位函數(shù)有:LONG Seek(LONG lOff,UINT nFrom);throw(CFileException);如果要求的位置合法,則Seek返回從文件開(kāi)始起的新字節(jié)偏移量 lOff:指針移動(dòng)的字節(jié)數(shù)。nFrom:指針移動(dòng)的模式??梢允荂File:begin,CFile:current,CFile:endvoid Seek
56、ToBegin( );DWORD SeekToEnd( );/返回文件長(zhǎng)度(字節(jié)數(shù))。下面是一個(gè)讀取位圖文件的信息的例子:CFile file;BITMAPINFOHEADER bmpinfo;tryfile.Open("D:ToolBar.bmp",CFile:modeRead);file.Seek(sizeof(BITMAPFILEHEADER),CFile:begin);file.Read(&bmpinfo,sizeof(BITMAPINFOHEADER );CString str;str.Format("位圖文件的長(zhǎng)是%d,高%d",bm
57、pinfo.biWidth,bmpinfo.biHeight);MessageBox(str);file.Close();catch(CFileException *e)CString str;str.Format("讀取數(shù)據(jù)失敗的原因是:%d",e->m_cause);MessageBox("str");file.Abort();e->Delete();讀取數(shù)據(jù):BOOL ReadFile(HANDLE hFile, /文件的句柄LPVOID lpBuffer, /用于保存讀入數(shù)據(jù)的一個(gè)緩沖區(qū)DWORD nNumberOfBytesToRe
58、ad, /要讀入的字符數(shù)LPDWORD lpNumberOfBytesRead, /從文件中實(shí)際讀入的字符數(shù)LPOVERLAPPED lpOverlapped /如文件打開(kāi)時(shí)指定了FILE_FLAG_OVERLAPPED,那么必須,用這個(gè)參數(shù)引用一個(gè)特殊的結(jié)構(gòu)。該結(jié)構(gòu)定義了一次異步讀取操作。否則,應(yīng)將這個(gè)參數(shù)設(shè)為NULL);CFile的成員函數(shù)有:UINT Read (void* lpBuf,UINT nCount); throw(CFileException);/ 返回值是傳輸?shù)骄彌_區(qū)的字節(jié)數(shù)。寫(xiě)入數(shù)據(jù):BOOL WriteFile(HANDLE hFile, /文件的句柄LPCVOID l
59、pBuffer, /要寫(xiě)入的一個(gè)數(shù)據(jù)緩沖區(qū)DWORD nNumberOfBytesToWrite, /要寫(xiě)入數(shù)據(jù)的字節(jié)數(shù)量。如寫(xiě)入零字節(jié),表示什么都不寫(xiě)入,但會(huì)更新文件的"上一次修改時(shí)間"。LPDWORD lpNumberOfBytesWritten, /實(shí)際寫(xiě)入文件的字節(jié)數(shù)量LPOVERLAPPED lpOverlapped / OVERLAPPED,倘若在指FILE_FLAG_OVERLAPPED的前提下打開(kāi)文件,這個(gè)參數(shù)就必須引用一個(gè)特殊的結(jié)構(gòu)。該結(jié)構(gòu)定義了一次異步寫(xiě)操作。否則,該參數(shù)應(yīng)置為NULL);void Write(const void* lpBuf,UINT nCount);throw
溫馨提示
- 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒(méi)有圖紙預(yù)覽就沒(méi)有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫(kù)網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 合伙人技術(shù)入股協(xié)議書(shū)合同
- 大班音樂(lè)《小白船》課件
- 2024年遼寧駕駛員客運(yùn)從業(yè)資格證考試題及答案
- 2024年重慶2024年客運(yùn)從業(yè)資格證考試試題
- 2024【房屋拆除合同范本】建筑拆除合同范本
- 2024職工食堂承包合同范本
- 2024家居工程裝修合同范本
- 2024農(nóng)村水庫(kù)承包合同書(shū)
- 2024項(xiàng)目投資咨詢合同版
- 深圳大學(xué)《游泳俱樂(lè)部》2023-2024學(xué)年第一學(xué)期期末試卷
- 銀行涉農(nóng)貸款專項(xiàng)統(tǒng)計(jì)制度講解
- DB31-T 540-2022 重點(diǎn)單位消防安全管理要求
- 兒化音變課件
- 國(guó)家開(kāi)放大學(xué)《傳感器與測(cè)試技術(shù)》實(shí)驗(yàn)參考答案
- 工程造價(jià)司法鑒定實(shí)施方案
- 材料成型工藝基礎(chǔ)習(xí)題答案
- 劇本寫(xiě)作課件
- 計(jì)算方法第三章函數(shù)逼近與快速傅里葉變換課件
- 五年級(jí)上冊(cè)英語(yǔ)課件-Unit7 At weekends第四課時(shí)|譯林版(三起) (共13張PPT)
- 2022年秋新教材高中英語(yǔ)Unit2SuccessTheImportanceofFailure教案北師大版選擇性必修第一冊(cè)
- 初三九年級(jí)青驕第二課堂期末考試題及參考答案
評(píng)論
0/150
提交評(píng)論