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

1、文件操作的方法

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

(1)使用標(biāo)準(zhǔn)C運(yùn)行庫(kù)函數(shù),包括fopen、fclose、fseek等。

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

???(3)使用Win32下的文件和目錄操作函數(shù),如CreateFile,CopyFile,DeleteFile,F(xiàn)indNextFile,等等。

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

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


2、文件操作的方法
MFC用一些類(lèi)來(lái)封裝文件訪問(wèn)的Win32 API。以CFile為基礎(chǔ),從CFile派生出幾個(gè)類(lèi),如CStdioFile,CMemFile,MFC內(nèi)部使用的CMiororFile,等等。

2.1、CFile的結(jié)構(gòu)

?????2.1.1、CFile定義的枚舉類(lèi)型

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

  1. OpenFlags

    OpenFlags定義了13種文件訪問(wèn)和共享模式:

    enum OpenFlags {

    //第一(從右,下同)至第二位,打開(kāi)文件時(shí)訪問(wèn)模式,讀/寫(xiě)/讀寫(xiě)

    modeRead = 0x0000,

    modeWrite = 0x0001,

    modeReadWrite = 0x0002,

    shareCompat = 0x0000, //32位MFC中沒(méi)用

    //第五到第七位,打開(kāi)文件時(shí)的共享模式

    shareExclusive = 0x0010,//獨(dú)占方式,禁止其他進(jìn)程讀寫(xiě)

    shareDenyWrite = 0x0020,//禁止其他進(jìn)程寫(xiě)

    shareDenyRead = 0x0030,//禁止其他進(jìn)程讀

    shareDenyNone = 0x0040,//允許其他進(jìn)程寫(xiě)

    //第八位,打開(kāi)文件時(shí)的文件繼承方式

    modeNoInherit = 0x0080,//不允許子進(jìn)程繼承

    //第十三、十四位,是否創(chuàng)建新文件和創(chuàng)建方式

    modeCreate = 0x1000,//創(chuàng)建新文件,文件長(zhǎng)度0

    modeNoTruncate = 0x2000,//創(chuàng)建新文件時(shí)如文件已存在則打開(kāi)

    //第十五、十六位,文件以二進(jìn)制或者文本方式打開(kāi),在派生類(lèi)CStdioFile中用

    typeText = 0x4000,

    typeBinary = (int)0x8000

    };

  2. Attribute

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

    enum Attribute {

    normal = 0x00,

    readOnly = 0x01,

    hidden = 0x02,

    system = 0x04,

    volume = 0x08,

    directory = 0x10,

    archive = 0x20

    }

  3. SeekPosition

    SeekPosition定義了三種文件位置:頭、尾、當(dāng)前:

    enum SeekPosition{

    begin = 0x0,

    current = 0x1,

    end = 0x2

    };

  4. hFileNull

hFileNull定義了空文件句柄

enum { hFileNull = -1 };

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

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

UINT m_hFile

該成員變量是public訪問(wèn)屬性,保存::CreateFile返回的操作系統(tǒng)的文件句柄。MFC重載了運(yùn)算符號(hào)HFILE來(lái)返回m_hFile,這樣在使用HFILE類(lèi)型變量的地方可以使用CFile對(duì)象。

BOOL m_bCloseOnDelete;

CString m_strFileName;

這兩個(gè)成員變量是protected訪問(wèn)屬性。m_bCloseOnDelete用來(lái)指示是否在關(guān)閉文件時(shí)刪除CFile對(duì)象;m_strFileName用來(lái)保存文件名。

2.1.3、CFile的成員函數(shù)

CFile的成員函數(shù)實(shí)現(xiàn)了對(duì)Win32文件操作函數(shù)的封裝,完成以下動(dòng)作:打開(kāi)、創(chuàng)建、關(guān)閉文件,文件指針定位,文件的鎖定與解鎖,文件狀態(tài)的讀取和修改,等等。其中,用到了m_hFile文件句柄的一般是虛擬函數(shù),和此無(wú)關(guān)的一般是靜態(tài)成員函數(shù)。一般地,成員函數(shù)被映射到對(duì)應(yīng)的Win32函數(shù),如表11-1所示。

表11-1 CFile函數(shù)對(duì)Win32文件函數(shù)的封裝

虛擬

靜態(tài)

成員函數(shù)

對(duì)應(yīng)的Win32函數(shù)

文件的創(chuàng)建、打開(kāi)、關(guān)閉

 

Abort

CloseHandle

 

Duplicate

DuplicateHandle

 

Open

CreateFile

 

Close

CloseHandle

文件的讀寫(xiě)

 

Read

ReadFile

   

ReadHuge(向后兼容)

調(diào)用Read成員函數(shù)

 

Write

WriteFile

   

WriteHuage(向后兼容)

調(diào)用Write成員函數(shù)

 

Flush

FlushFileBuffers

文件定位

 

Seek

SetFilePointer

   

SeekToBegin

調(diào)用Seek成員函數(shù)

   

SeekToEnd

調(diào)用Seek成員函數(shù)

 

GetLength

調(diào)用Seek成員函數(shù)

 

SetLength

SetEndOfFile

文件的鎖定/解鎖

 

LockRange

LockFile

 

UnlockRange

UnlockFile

文件狀態(tài)操作函數(shù)

 

GetPosition

SetFilePointer

   

GetStatus(CFileStatus&)

GetFileTime,GetFileSize等

 

GetStatus(LPSTR lpszFileName CFileStatus&)

FindFirstFile

 

GetFileName

不是簡(jiǎn)單地映射到某個(gè)函數(shù)

 

GetFileTitle

 

 

GetFilePath

 

 

SetFilePath

 
 

SetStatus

 

改名和刪除

 

Rename

MoveFile

 

Remove

DeleteFile


2.1.4、CFile的部分實(shí)現(xiàn)


這里主要討論CFile對(duì)象的構(gòu)造函數(shù)和文件的打開(kāi)/創(chuàng)建的過(guò)程。

  1. 構(gòu)造函數(shù)

CFile有如下幾個(gè)構(gòu)造函數(shù):

  • CFile()

缺省構(gòu)造函數(shù),僅僅構(gòu)造一個(gè)CFile對(duì)象,還必須使用Open成員函數(shù)來(lái)打開(kāi)文件。

  • CFile(int hFile)

已經(jīng)打開(kāi)了一個(gè)文件hFile,在此基礎(chǔ)上構(gòu)造一個(gè)CFile對(duì)象來(lái)給它打包。HFile將被賦值給CFile的成員變量m_hFile。

  • CFile(LPCTSTR lpszFileName, UINT nOpenFlags)

指定一個(gè)文件名和文件打開(kāi)方式,構(gòu)造CFile對(duì)象,調(diào)用Open打開(kāi)/創(chuàng)建文件,把文件句柄保存到m_hFile。

  1. 打開(kāi)/創(chuàng)建文件

Open的原型如下:

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

CFileException* pException)

Open調(diào)用Win32函數(shù)::CreateFile打開(kāi)文件,并把文件句柄保存到成員變量m_hFile中。

CreateFile函數(shù)的原型如下:

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必須把自己的兩個(gè)參數(shù)lpszFileName和nOpenFlags映射到CreateFile的七個(gè)參數(shù)上。

從OpenFlags的定義可以看出,(nOpenFlags & 3)表示了讀寫(xiě)標(biāo)識(shí),映射成變量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定義了一個(gè)局部的SECURITY_ATTRIBUTES變量sa,(nOpenFlags & 0x80)被賦值給sa.bInheritHandle。

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

在生成了上述參數(shù)之后,先調(diào)用::CreateFile:

HANDLE hFile =::CreateFile(lpszFileName,

dwAccess, dwShareMode, &sa,

dwCreateFlag, FILE_ATTRIBUTE_NORMAL, NULL);

然后,hFile被賦值給成員變量m_hFile,m_bCloseOnDelete被設(shè)置為T(mén)RUE。

由上可以看出,CFile打開(kāi)(創(chuàng)建)一個(gè)文件時(shí)大大簡(jiǎn)化了:: CreateFile函數(shù)的復(fù)雜性,即只需要指定一個(gè)文件名、一個(gè)打開(kāi)文件的參數(shù)即可。若該參數(shù)指定為0,則表示以只讀方式打開(kāi)一個(gè)存在的文件,獨(dú)占使用,不允許子進(jìn)程繼承。

在CFile對(duì)象使用時(shí),如果它是在堆中分配的,則應(yīng)該銷(xiāo)毀它;如果在棧中分配的,則CFile對(duì)象將被自動(dòng)銷(xiāo)毀。銷(xiāo)毀時(shí)析構(gòu)函數(shù)被調(diào)用,析構(gòu)函數(shù)是虛擬函數(shù)。若m_bCloseOnDelete為真且m_hFile非空,則析構(gòu)函數(shù)調(diào)用Close關(guān)閉文件。

至于其他CFile成員函數(shù)的實(shí)現(xiàn),這里不作分析了。

2.1.5、CFile的派生類(lèi)

這里主要簡(jiǎn)要地介紹CStdioFile和CmemFile及CFileFind。

  1. CStdioFile

    CStdioFile對(duì)文本文件進(jìn)行操作。

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

    另外,CStdioFile不支持CFile的Dumplicate、LockRange、UnlockRange操作,但是實(shí)現(xiàn)了兩個(gè)新的操作ReadString和WriteString。

  2. CMemFile

    CMemFile把一塊內(nèi)存當(dāng)作一個(gè)文件來(lái)操作,所以,它沒(méi)有打開(kāi)文件的操作,而是設(shè)計(jì)了Attach和Detach用來(lái)分配或者釋放一塊內(nèi)存。相應(yīng)地,它提供了Alloc、Free虛擬函數(shù)來(lái)操作內(nèi)存文件,它覆蓋了Read、Write來(lái)讀寫(xiě)內(nèi)存文件。

  3. CFileFind

為了方便文件查找,MFC把有關(guān)功能歸結(jié)成為一個(gè)類(lèi)CFileFind。CFileFind派生于CObject類(lèi)。首先,它使用FindFile和FineNextFile包裝了Win32函數(shù)::FindFirstFile和::FindNextFile;其次,它提供了許多函數(shù)用來(lái)獲取文件的狀態(tài)或者屬性。

使用CFileStatus結(jié)構(gòu)來(lái)描述文件的屬性,其定義如下:

struct CFileStatus

{

CTime m_ctime; // 文件創(chuàng)建時(shí)間

CTime m_mtime; // 文件最近一次修改時(shí)間

CTime m_atime; // 文件最近一次訪問(wèn)時(shí)間

LONG m_size; // 文件大小

BYTE m_attribute; // 文件屬性

BYTE _m_padding; // 沒(méi)有實(shí)際含義,用來(lái)增加一個(gè)字節(jié)

TCHAR m_szFullName[_MAX_PATH]; //絕對(duì)路徑

#ifdef _DEBUG

//實(shí)現(xiàn)Dump虛擬函數(shù),輸出文件屬性

void Dump(CDumpContext& dc) const;

#endif

};

例如:

CFileStatus status;

pFile->GetStatus(status);

#ifdef _DEBUG

status.dump(afxDump);

#endif

 

Feedback

# re: 十一、 MFC下的文件類(lèi)   回復(fù)  更多評(píng)論   

2007-03-06 19:58 by 梁全
我正需要,謝謝?。?!

只有注冊(cè)用戶(hù)登錄后才能發(fā)表評(píng)論。
網(wǎng)站導(dǎo)航: 博客園   IT新聞   BlogJava   博問(wèn)   Chat2DB   管理


posts - 3, comments - 4, trackbacks - 0, articles - 0

Copyright © 逃逃

青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品
  • <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>
            欧美激情一区二区在线| 欧美激情在线观看| 日韩一级大片| 国产精品丝袜白浆摸在线| 亚洲欧美日韩一区二区在线| 国产欧美一区在线| 国产亚洲观看| 一区二区在线观看av| 精品动漫3d一区二区三区| 在线观看视频一区二区欧美日韩| 亚洲国产精品一区二区www| 激情综合视频| 亚洲二区视频| 欧美日韩中文字幕日韩欧美| 性久久久久久| 欧美专区在线观看| 免费国产一区二区| 亚洲毛片一区| 香蕉成人久久| 欧美大片91| 国产私拍一区| 亚洲精品乱码久久久久久黑人| 亚洲视频视频在线| 美女久久网站| 亚洲欧美成人| 欧美伦理91i| 韩国欧美一区| 亚洲九九精品| 国产精品免费视频观看| 国内免费精品永久在线视频| 亚洲精品偷拍| 久久综合九色综合久99| 一本色道**综合亚洲精品蜜桃冫| 欧美影院精品一区| 欧美日韩精品在线播放| 怡红院精品视频| 性久久久久久久| 日韩亚洲一区二区| 欧美成人精品不卡视频在线观看 | 亚洲精品免费在线| 亚洲美女电影在线| 久久国产精品99国产| 欧美福利专区| 狠狠干狠狠久久| 午夜精品三级视频福利| 亚洲高清视频的网址| 日韩视频免费在线| 老鸭窝亚洲一区二区三区| 国产精品中文在线| 亚洲一区久久| 亚洲精品一级| 欧美激情自拍| 亚洲精品国偷自产在线99热| 理论片一区二区在线| 久久成人精品无人区| 欧美日韩一区高清| 亚洲精品在线电影| 亚洲日本电影在线| 亚洲第一在线综合网站| 久久漫画官网| 亚洲激情在线| 亚洲日本va午夜在线影院| 欧美mv日韩mv国产网站| 亚洲国产一区二区三区在线播| 久久综合激情| 免费成人美女女| 亚洲精品美女91| 亚洲精品一线二线三线无人区| 欧美极品一区二区三区| 日韩亚洲欧美在线观看| 99re热这里只有精品免费视频| 欧美日韩国产精品自在自线| 亚洲四色影视在线观看| 亚洲综合视频一区| 国产丝袜一区二区| 久久躁日日躁aaaaxxxx| 美女日韩欧美| 亚洲午夜三级在线| 亚洲主播在线观看| 国内一区二区在线视频观看 | 欧美国产日韩精品| 欧美精品日韩| 亚洲欧美日韩一区二区在线 | 在线午夜精品| 午夜在线精品偷拍| 亚洲国产精品视频一区| 欧美午夜不卡影院在线观看完整版免费| 久久久国产精品一区二区三区| 国产字幕视频一区二区| 亚洲激情视频| 国产欧美在线观看一区| 欧美黄色小视频| 欧美77777| 欧美一区二区三区在线观看视频| 国产欧美在线观看| 亚洲国产乱码最新视频| 国产精品视频第一区| 免费成人黄色片| 国产精品xxxxx| 欧美大胆成人| 国产精品一区二区男女羞羞无遮挡| 久久视频精品在线| 欧美男人的天堂| 久久一区亚洲| 国产精品拍天天在线| 亚洲电影av在线| 国产一区二区三区免费在线观看 | 久久一本综合频道| 亚洲一区二区少妇| 美女久久一区| 老牛嫩草一区二区三区日本| 欧美午夜精品久久久久免费视 | 免费影视亚洲| 欧美一区二区在线免费观看| 亚洲欧美另类国产| 一区二区三区精品| 老司机免费视频久久| 欧美一区激情| 国产精品www| 亚洲第一精品福利| 国产亚洲人成a一在线v站| 99ri日韩精品视频| 亚洲每日更新| 欧美成人免费小视频| 免费成人黄色av| 精品成人一区二区| 久久动漫亚洲| 久久理论片午夜琪琪电影网| 国产精品午夜电影| 亚洲专区在线| 欧美在线视频在线播放完整版免费观看 | 美女啪啪无遮挡免费久久网站| 国产精品人成在线观看免费 | 欧美精品一区二区精品网| 欧美成人首页| 亚洲国产精品成人va在线观看| 久久精品亚洲| 亚洲欧洲午夜| 国产一区二区丝袜高跟鞋图片| 亚洲图片欧美日产| 欧美激情va永久在线播放| 精品动漫3d一区二区三区| 亚洲欧美日本另类| 性一交一乱一区二区洋洋av| 国产精品久久久一本精品| 中文精品视频一区二区在线观看| 亚洲视频自拍偷拍| 国产精品乱码一区二三区小蝌蚪| 在线一区日本视频| 性色av一区二区怡红| 国产一区在线看| 美女性感视频久久久| 亚洲精品乱码| 午夜精品久久一牛影视| 国产精品一区久久久久| 欧美一站二站| 亚洲国产成人久久| 亚洲免费伊人电影在线观看av| 国产精品乱码一区二区三区| 久久精品久久99精品久久| 欧美激情第二页| 亚洲午夜一区二区三区| 国产视频在线观看一区| 免费在线国产精品| 一区二区久久久久久| 久久久免费精品视频| 亚洲激情一区二区| 国产精品美女在线| 久久亚洲不卡| 亚洲视频一二区| 麻豆精品视频在线| 亚洲一区二区成人在线观看| 午夜久久一区| 亚洲一区二区三区在线看| 久久资源在线| 亚洲伦理在线免费看| 国产日韩欧美电影在线观看| 欧美77777| 欧美在线观看一区二区三区| 亚洲国产欧洲综合997久久| 欧美一区二区三区四区在线观看| 亚洲国产精品久久久久秋霞不卡| 国产精品国产三级国产专播精品人| 久久久无码精品亚洲日韩按摩| 99在线|亚洲一区二区| 欧美不卡在线| 午夜日韩av| 一个色综合导航| 黄色成人在线免费| 欧美日韩一区二区三区在线视频 | 欧美在线视频二区| 一区二区三区国产在线| 亚洲国产欧美一区二区三区同亚洲| 欧美日韩亚洲一区| 欧美成人精品1314www| 久久视频一区二区| 欧美一区二区在线| 亚洲欧美日韩综合国产aⅴ| 亚洲免费成人| 亚洲精品小视频在线观看|