青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品

asm, c, c++ are my all
-- Core In Computer
posts - 139,  comments - 123,  trackbacks - 0

MFC下的文件類

轉自 http://m.shnenglu.com/RancyGe/archive/2006/05/22/7496.html


1、文件操作的方法

?? 使用Visual C++編程,有如下方法進行文件操作:

(1)使用標準C運行庫函數,包括fopen、fclose、fseek等。

(2)使用Win16下的文件和目錄操作函數,如lopen、lclose、lseek等。不過,在Win32下,這些函數主要是為了和Win16向后兼容。

(3)使用Win32下的文件和目錄操作函數,如CreateFile,CopyFile,DeleteFile,FindNextFile,等等。

???????? Win32下,打開和創建文件都由CreateFile完成,成功的話,得到一個Win32下的句柄,這不同于“C”的fopen返回的句柄。在Win16下,該句柄和C運行庫文件操作函數相容。但在Win32下,“C”的文件操作函數不能使用該句柄,如果需要的話,可以使用函數_open_osfhandle從Win32句柄得到一個“C”文件函數可以使用的文件句柄。 關閉文件使用Win32的CloseHandle。 在Win32下,CreateFile可以操作的對象除了磁盤文件外,還包括設備文件如通訊端口、管道、控制臺輸入、郵件槽等等。

(4)使用CFile和其派生類進行文件操作。CFile從CObject派生,其派生類包括操作文本文件的CStdioFile,操作內存文件的CmemFile,等等。CFile是建立在Win32的文件操作體系的基礎上,它封裝了部分Win32文件操作函數。最好是使用CFile類(或派生類)的對象來操作文件,必要的話,可以從這些類派生自己的文件操作類。統一使用CFile的界面可以得到好的移植性。

2、文件操作的方法
MFC用一些類來封裝文件訪問的Win32 API。以CFile為基礎,從CFile派生出幾個類,如CStdioFile,CMemFile,MFC內部使用的CMiororFile,等等。

2.1、CFile的結構

2.1.1、CFile定義的枚舉類型

CFile類定義了一些和文件操作相關的枚舉類型,主要有四種:OpenFlags,Attribute,SeekPosition,hFileNull。下面,分別解釋這些枚舉類型。

OpenFlags

OpenFlags定義了13種文件訪問和共享模式:

enum OpenFlags {

//第一(從右,下同)至第二位,打開文件時訪問模式,讀/寫/讀寫

modeRead = 0x0000,

modeWrite = 0x0001,

modeReadWrite = 0x0002,

shareCompat = 0x0000, //32位MFC中沒用

//第五到第七位,打開文件時的共享模式

shareExclusive = 0x0010,//獨占方式,禁止其他進程讀寫

shareDenyWrite = 0x0020,//禁止其他進程寫

shareDenyRead = 0x0030,//禁止其他進程讀

shareDenyNone = 0x0040,//允許其他進程寫

//第八位,打開文件時的文件繼承方式

modeNoInherit = 0x0080,//不允許子進程繼承

//第十三、十四位,是否創建新文件和創建方式

modeCreate = 0x1000,//創建新文件,文件長度0

modeNoTruncate = 0x2000,//創建新文件時如文件已存在則打開

//第十五、十六位,文件以二進制或者文本方式打開,在派生類CStdioFile中用

typeText = 0x4000,

typeBinary = (int)0x8000

};


Attribute

Attribute定義了文件屬性:正常、只讀、隱含、系統文件,文件或者目錄等。

enum Attribute {

normal = 0x00,

readOnly = 0x01,

hidden = 0x02,

system = 0x04,

volume = 0x08,

directory = 0x10,

archive = 0x20

}


SeekPosition

SeekPosition定義了三種文件位置:頭、尾、當前:

enum SeekPosition{

begin = 0x0,

current = 0x1,

end = 0x2

};


hFileNull

hFileNull定義了空文件句柄

enum { hFileNull = -1 };


2.1.2、CFile的其他一些成員變量


CFile除了定義枚舉類型,還定義了一些成員變量。例如:

UINT m_hFile

該成員變量是public訪問屬性,保存::CreateFile返回的操作系統的文件句柄。MFC重載了運算符號HFILE來返回m_hFile,這樣在使用HFILE類型變量的地方可以使用CFile對象。

BOOL m_bCloseOnDelete;
CString m_strFileName;

這兩個成員變量是protected訪問屬性。m_bCloseOnDelete用來指示是否在關閉文件時刪除CFile對象;m_strFileName用來保存文件名。

2.1.3、CFile的成員函數

CFile的成員函數實現了對Win32文件操作函數的封裝,完成以下動作:打開、創建、關閉文件,文件指針定位,文件的鎖定與解鎖,文件狀態的讀取和修改,等等。其中,用到了m_hFile文件句柄的一般是虛擬函數,和此無關的一般是靜態成員函數。一般地,成員函數被映射到對應的Win32函數,如表11-1所示。

??????? 表11-1 CFile函數對Win32文件函數的封裝

虛擬

靜態

成員函數

對應的Win32函數

文件的創建、打開、關閉

 

Abort

CloseHandle

 

Duplicate

DuplicateHandle

 

Open

CreateFile

 

Close

CloseHandle

文件的讀寫

 

Read

ReadFile

   

ReadHuge(向后兼容)

調用Read成員函數

 

Write

WriteFile

   

WriteHuage(向后兼容)

調用Write成員函數

 

Flush

FlushFileBuffers

文件定位

 

Seek

SetFilePointer

   

SeekToBegin

調用Seek成員函數

   

SeekToEnd

調用Seek成員函數

 

GetLength

調用Seek成員函數

 

SetLength

SetEndOfFile

文件的鎖定/解鎖

 

LockRange

LockFile

 

UnlockRange

UnlockFile

文件狀態操作函數

 

GetPosition

SetFilePointer

   

GetStatus(CFileStatus&)

GetFileTime,GetFileSize等

 

GetStatus(LPSTR lpszFileName CFileStatus&)

FindFirstFile

 

GetFileName

不是簡單地映射到某個函數

 

GetFileTitle

 

 

GetFilePath

 

 

SetFilePath

 
 

SetStatus

 

改名和刪除

 

Rename

MoveFile

 

Remove

DeleteFile


2.1.4、CFile的部分實現

這里主要討論CFile對象的構造函數和文件的打開/創建的過程。

構造函數

CFile有如下幾個構造函數:

CFile()

缺省構造函數,僅僅構造一個CFile對象,還必須使用Open成員函數來打開文件。

CFile(int hFile)

已經打開了一個文件hFile,在此基礎上構造一個CFile對象來給它打包。HFile將被賦值給CFile的成員變量m_hFile。

CFile(LPCTSTR lpszFileName, UINT nOpenFlags)

指定一個文件名和文件打開方式,構造CFile對象,調用Open打開/創建文件,把文件句柄保存到m_hFile。

打開/創建文件

Open的原型如下:

BOOL CFile::Open(LPCTSTR lpszFileName, UINT nOpenFlags,

CFileException* pException)

Open調用Win32函數::CreateFile打開文件,并把文件句柄保存到成員變量m_hFile中。

CreateFile函數的原型如下:

HANDLE CreateFile(
?LPCTSTR lpFileName,?? // pointer to name of the file
?DWORD dwDesiredAccess,// access (read-write) mode
?DWORD dwShareMode,??? // share mode
?LPSECURITY_ATTRIBUTES lpSecurityAttributes, //pointer to security descriptor
?DWORD dwCreationDistribution,// how to create
?DWORD dwFlagsAndAttributes,? // file attributes
?HANDLE hTemplateFile???????? // handle to file with attributes to copy
);

顯然,Open必須把自己的兩個參數lpszFileName和nOpenFlags映射到CreateFile的七個參數上。

從OpenFlags的定義可以看出,(nOpenFlags & 3)表示了讀寫標識,映射成變量dwAccess,可以取值為Win32的GENERIC_READ、GENERIC_WRITE、GENERIC_READ|GENERIC_WRITE。

(nOpenFlags & 0x70)表示了共享模式,映射成變量dwShareMode,可以取值為Win32的FILE_SHARE_READ、FILE_SHARE_WRITE、FILE_SHARE_WRITE|FILE_SHARE_READ。

Open定義了一個局部的SECURITY_ATTRIBUTES變量sa,(nOpenFlags & 0x80)被賦值給sa.bInheritHandle。

(nOpenFlags & modeCreate)表示了創建方式,映射成變量dwCreateFlag,可以取值為Win32的OPEN_ALWAYS、CREATE_ALWAYS、OPEN_EXISTING。

在生成了上述參數之后,先調用::CreateFile:

HANDLE hFile =::CreateFile(lpszFileName,

dwAccess, dwShareMode, &sa,

dwCreateFlag, FILE_ATTRIBUTE_NORMAL, NULL);

然后,hFile被賦值給成員變量m_hFile,m_bCloseOnDelete被設置為TRUE。


由上可以看出,CFile打開(創建)一個文件時大大簡化了:: CreateFile函數的復雜性,即只需要指定一個文件名、一個打開文件的參數即可。若該參數指定為0,則表示以只讀方式打開一個存在的文件,獨占使用,不允許子進程繼承。

在CFile對象使用時,如果它是在堆中分配的,則應該銷毀它;如果在棧中分配的,則CFile對象將被自動銷毀。銷毀時析構函數被調用,析構函數是虛擬函數。若m_bCloseOnDelete為真且m_hFile非空,則析構函數調用Close關閉文件。

至于其他CFile成員函數的實現,這里不作分析了。

2.1.5、CFile的派生類

這里主要簡要地介紹CStdioFile和CmemFile及CFileFind。

CStdioFile
CStdioFile對文本文件進行操作。

CStdioFile定義了新的成員變量m_pStream,類型是FILE*。在打開或者創建文件時,使用_open_osfhandle從m_hFile(Win32文件句柄)得到一個“C”的FILE類型的文件指針,然后,在文件操作中,使用“C”的文件操作函數。例如,讀文件使用_fread,而不是::ReadFile,寫文件使用了_fwrite,而不是::WriteFile,等等。m_hFile是CFile的成員變量。

另外,CStdioFile不支持CFile的Dumplicate、LockRange、UnlockRange操作,但是實現了兩個新的操作ReadString和WriteString。

CMemFile

CMemFile把一塊內存當作一個文件來操作,所以,它沒有打開文件的操作,而是設計了Attach和Detach用來分配或者釋放一塊內存。相應地,它提供了Alloc、Free虛擬函數來操作內存文件,它覆蓋了Read、Write來讀寫內存文件。

CFileFind

為了方便文件查找,MFC把有關功能歸結成為一個類CFileFind。CFileFind派生于CObject類。首先,它使用FindFile和FineNextFile包裝了Win32函數::FindFirstFile和::FindNextFile;其次,它提供了許多函數用來獲取文件的狀態或者屬性。

使用CFileStatus結構來描述文件的屬性,其定義如下:

struct CFileStatus
{
???????CTime m_ctime; // 文件創建時間
???????CTime m_mtime; // 文件最近一次修改時間
???????CTime m_atime; // 文件最近一次訪問時間
???????LONG m_size; // 文件大小
???????BYTE m_attribute; // 文件屬性
???????BYTE _m_padding; // 沒有實際含義,用來增加一個字節
???????TCHAR m_szFullName[_MAX_PATH]; //絕對路徑

#ifdef _DEBUG
//實現Dump虛擬函數,輸出文件屬性
void Dump(CDumpContext& dc) const;
#endif

};

例如:

CFileStatus status;
pFile->GetStatus(status);
#ifdef _DEBUG
status.dump(afxDump);
#endif

posted on 2006-05-23 21:17 Jerry Cat 閱讀(751) 評論(1)  編輯 收藏 引用

FeedBack:
# re: MFC下的文件類
2006-05-25 13:13 | 漂舟
支持Jerry Cat , 經常貼些通俗的文件來看,
這樣對后來者有很大幫助,
在此說聲謝謝   回復  更多評論
  

只有注冊用戶登錄后才能發表評論。
網站導航: 博客園   IT新聞   BlogJava   博問   Chat2DB   管理



<2006年5月>
30123456
78910111213
14151617181920
21222324252627
28293031123
45678910

常用鏈接

留言簿(7)

隨筆檔案

最新隨筆

搜索

  •  

最新評論

閱讀排行榜

評論排行榜

青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品
  • <ins id="pjuwb"></ins>
    <blockquote id="pjuwb"><pre id="pjuwb"></pre></blockquote>
    <noscript id="pjuwb"></noscript>
          <sup id="pjuwb"><pre id="pjuwb"></pre></sup>
            <dd id="pjuwb"></dd>
            <abbr id="pjuwb"></abbr>
            国产一区二区久久精品| 国内成人在线| 日韩午夜视频在线观看| 久久精品网址| 久久久一区二区| 欧美一区二区在线免费播放| 亚洲国产精品一区二区久| 国产视频一区二区在线观看| 国产精品www| 国产乱码精品一区二区三区av| 欧美日本韩国一区| 欧美午夜视频网站| 国产午夜精品福利| 亚洲国产精品久久久久秋霞不卡| 国产一区二区精品丝袜| 精品51国产黑色丝袜高跟鞋| 国产区精品在线观看| 久久嫩草精品久久久精品| av成人免费观看| 一区二区三欧美| 久久久国产一区二区| 欧美a级理论片| 国产免费亚洲高清| 夜夜爽av福利精品导航 | 亚洲精品女人| 久久久久久亚洲精品杨幂换脸| 久久另类ts人妖一区二区| 亚洲人成亚洲人成在线观看图片| 一区二区免费在线视频| 麻豆精品网站| 在线观看福利一区| 亚洲一区二区综合| aaa亚洲精品一二三区| 久久综合精品国产一区二区三区| 国产精品乱码一区二三区小蝌蚪 | 91久久香蕉国产日韩欧美9色 | 亚洲国产日韩欧美在线动漫| 亚洲午夜视频在线| 一本久久综合亚洲鲁鲁| 欧美日韩一区综合| 亚洲欧美第一页| 亚洲在线免费观看| 国产精品区一区二区三| 欧美一二三区在线观看| 亚洲一区二区三区四区中文 | 蜜臀va亚洲va欧美va天堂| 亚洲欧美变态国产另类| 亚洲欧美日韩国产精品| 国产精品综合色区在线观看| 中文av字幕一区| 亚洲一区不卡| 韩国成人福利片在线播放| 欧美α欧美αv大片| 欧美日韩国产色综合一二三四| 一区二区三区日韩欧美| 亚洲欧美日韩精品久久| 久久久久久久久岛国免费| 欧美国产一区二区三区激情无套| 亚洲午夜激情免费视频| 国产精品揄拍500视频| 一区二区av| 国产精品99久久不卡二区| 欧美精品国产精品| 欧美精品 日韩| 亚洲人在线视频| 亚洲成色精品| 国产日韩欧美综合在线| 麻豆国产精品777777在线| 欧美亚洲午夜视频在线观看| 国产日韩在线看片| 亚洲国产成人porn| 国产精品亚洲а∨天堂免在线| 亚洲欧洲一区二区天堂久久| 国产精品一区毛片| 亚洲精品一区二区在线| 国产欧美视频一区二区三区| 免费成人高清| 久久精品国产精品| 国产欧美日韩不卡| 日韩网站在线| 亚洲欧美日韩天堂| 国产精品久久国产愉拍| 亚洲视频在线观看网站| 欧美一二三区精品| 国产日韩欧美一区二区三区四区| 午夜精品理论片| 欧美高清在线精品一区| 在线视频欧美精品| 国产精品自拍小视频| 久久精品视频免费| 亚洲另类视频| 久久福利精品| 夜夜夜久久久| 国产综合久久久久久鬼色| 久久精品国产第一区二区三区| 亚洲第一精品久久忘忧草社区| 中文在线不卡| 亚洲激情不卡| 在线电影国产精品| 国产精品久久久久久影视 | 一级成人国产| 国语自产精品视频在线看抢先版结局 | 亚洲在线黄色| 久久久精品一区二区三区| 一本色道久久综合亚洲精品按摩 | 亚洲国产精品悠悠久久琪琪| 美日韩精品免费观看视频| 亚洲免费视频中文字幕| 99视频在线精品国自产拍免费观看| 欧美在线影院| 激情自拍一区| 国产一区 二区 三区一级| 欧美精品日韩综合在线| 久久精品最新地址| 亚洲在线免费视频| 午夜精品福利视频| 中文一区在线| 亚洲欧美日韩国产中文| 国产真实精品久久二三区| 久久亚洲精品视频| 亚洲欧美日韩精品久久| 日韩午夜精品视频| 亚洲日本乱码在线观看| 亚洲激情偷拍| 亚洲日本中文字幕免费在线不卡| 久久亚洲一区| 亚洲人成在线观看一区二区 | 午夜精品久久久久久久蜜桃app | a4yy欧美一区二区三区| 日韩亚洲欧美精品| 欧美亚洲一区| 性久久久久久久久久久久| 亚洲欧美日韩在线综合| 久久久久国产精品一区| 欧美精品九九| 精品福利免费观看| 99精品国产高清一区二区| 久久婷婷亚洲| 在线亚洲成人| 欧美激情精品久久久久久变态 | 欧美a级一区| 亚洲女与黑人做爰| 欧美日韩亚洲免费| 一本久道久久综合中文字幕| 欧美在线高清| 一本一本大道香蕉久在线精品| 欧美一乱一性一交一视频| 欧美日韩成人综合天天影院| 在线看欧美视频| 久久久www成人免费精品| 亚洲精品一二三| 欧美黑人一区二区三区| 亚洲国产日韩在线| 欧美成人精品1314www| 久久天堂国产精品| 精品动漫3d一区二区三区免费| 久久国产婷婷国产香蕉| 欧美一区影院| 亚洲国产日韩综合一区| 亚洲国产日韩欧美一区二区三区| 欧美3dxxxxhd| avtt综合网| 亚洲午夜视频在线观看| 国产精品高潮粉嫩av| 亚洲欧美国产一区二区三区| 亚洲最新视频在线| 国产一区二区三区电影在线观看| 久久天天躁夜夜躁狠狠躁2022| 久久资源在线| 欧美一区二区三区的| 久热精品在线视频| 亚洲专区免费| 久久深夜福利免费观看| 翔田千里一区二区| 午夜久久久久| 亚洲免费黄色| 老牛国产精品一区的观看方式| 欧美一级二级三级蜜桃| 一区二区日本视频| 久久久久久久久久久久久久一区 | 免费观看一级特黄欧美大片| 男女激情久久| 亚洲国产精品精华液网站| 亚洲一区免费观看| 欧美亚洲日本国产| 欧美三级第一页| 亚洲一区二区精品在线| 亚洲尤物在线| 国产精品二区影院| 欧美中文字幕精品| 欧美激情精品久久久久久蜜臀 | 免费h精品视频在线播放| 国产日产高清欧美一区二区三区| 午夜精品视频一区| 亚洲国产成人不卡| 亚洲一区网站| 欧美日韩国产一区二区| 亚洲欧美日韩精品久久亚洲区| 亚洲国产导航| 欧美成人午夜激情在线|