MFC中对文件的操作方法(转)

  1. MFC下的文件类

    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的文件类

      MFC用一些类来封装文件访问的Win32 API。以CFile为基础,从CFile派生出几个类,如CStdioFile,CMemFile,MFC内部使用的CMiororFile,等等。

      1. CFile的结构

        1. CFile定义的枚举类型

CFile类定义了一些和文件操作相关的枚举类型,主要有四种:OpenFlags,Attribute,SeekPosition,hFileNull。下面,分别解释这些枚举类型。

  1. 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

    };

  2. Attribute

    Attribute定义了文件属性:正常、只读、隐含、系统文件,文件或者目录等。

    enum Attribute {

    normal = 0x00,

    readOnly = 0x01,

    hidden = 0x02,

    system = 0x04,

    volume = 0x08,

    directory = 0x10,

    archive = 0x20

    }

  3. SeekPosition

    SeekPosition定义了三种文件位置:头、尾、当前:

    enum SeekPosition{

    begin = 0x0,

    current = 0x1,

    end = 0x2

    };

  4. hFileNull

hFileNull定义了空文件句柄

enum { hFileNull = -1 };

        1. 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. 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

 

      1. CFile的部分实现

这里主要讨论CFile对象的构造函数和文件的打开/创建的过程。

  1. 构造函数

CFile有如下几个构造函数:

  • CFile()

缺省构造函数,仅仅构造一个CFile对象,还必须使用Open成员函数来打开文件。

  • CFile(int hFile)

已经打开了一个文件hFile,在此基础上构造一个CFile对象来给它打包。HFile将被赋值给CFile的成员变量m_hFile。

  • CFile(LPCTSTR lpszFileName, UINT nOpenFlags)

指定一个文件名和文件打开方式,构造CFile对象,调用Open打开/创建文件,把文件句柄保存到m_hFile。

  1. 打开/创建文件

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成员函数的实现,这里不作分析了。

      1. CFile的派生类

这里主要简要地介绍CStdioFile和CmemFile及CFileFind。

  1. 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。

  2. CMemFile

    CMemFile把一块内存当作一个文件来操作,所以,它没有打开文件的操作,而是设计了Attach和Detach用来分配或者释放一块内存。相应地,它提供了Alloc、Free虚拟函数来操作内存文件,它覆盖了Read、Write来读写内存文件。

  3. 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


转载来自: http://blog.csdn.net/zqho/article/details/1602272 


  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: VC 6.0是微软公司开发的一款集成开发环境,MFC(Microsoft Foundation Classes)是其一部分,用于开发Windows平台上的C++应用程序。在VC 6.0MFC提供了丰富的文件操作功能,以便开发者可以方便地进行文件的读写和处理。 MFC文件操作主要通过CFile类来实现。要进行文件操作,首先需要创建一个CFile对象,并指定文件名和打开模式。打开模式可以是读取(CFile::modeRead)、写入(CFile::modeWrite)、读写(CFile::modeReadWrite)等。然后,可以通过CFile对象调用相应的方法来实现文件的读写操作。 常用的文件操作方法包括Read、ReadString、ReadHuge等。其,Read方法用于读取指定数量的字节到缓冲区,ReadString方法用于读取一行字符串,ReadHuge方法用于读取大型文件。在读取文件前,需要使用CFile的Open方法打开文件,读取完成后,需要调用Close方法关闭文件文件操作方法包括Write、WriteString、WriteHuge等。其,Write方法用于将指定数量的字节从缓冲区写入文件,WriteString方法用于将字符串写入文件,WriteHuge方法用于写入大型文件。在写入文件前,也需要使用CFile的Open方法打开文件,写入完成后,同样需要调用Close方法关闭文件。 此外,MFC还提供了其他一些文件操作的辅助功能,如文件的创建与删除、文件的属性设置、文件指针的定位等。 总之,VC 6.0MFC文件操作功能强大且灵活,可以满足各种文件操作的需求。开发者可以根据具体的应用场景,选择适合的文件操作方法,并结合其他MFC的功能,实现更加复杂的文件处理功能。 ### 回答2: VC 6.0是微软的一款集成开发环境,MFC(Microsoft Foundation Classes)是一套用于开发Windows应用程序的C++类库。在VC 6.0,我们可以使用MFC进行文件操作。 MFC提供了一系列的类来进行文件的创建、打开、读取、写入和关闭等操作。首先,我们可以使用CFile类来创建或打开一个文件,并进行读写操作。我们可以使用Open函数来打开一个已经存在的文件或者使用Create函数来创建一个新的文件。然后,可以使用Read和Write函数进行数据的读取和写入。最后,使用Close函数关闭文件。通过这些函数,我们可以灵活地操作文件。 另外,MFC还提供了CStdioFile类,它是对CFile类的一个高级封装。使用CStdioFile类,我们可以更方便地进行文本文件的读写操作。例如,可以使用ReadString函数逐行读取文本文件的内容,使用WriteString函数将字符串写入文本文件。 此外,MFC还提供了CFileDialog类,用于显示文件选择对话框,方便用户选择文件。通过这个类,我们可以让用户选择要打开或保存的文件,并获取用户选择的文件路径。 总结起来,VC 6.0的MFC提供了丰富的文件操作类和函数,可以方便地进行文件的读写,包括二进制文件和文本文件。开发者可以根据自己的需要使用相应的类和函数来操作文件,以完成各种文件处理任务。 ### 回答3: VC 6.0的MFC(Microsoft Foundation Class)库提供了一些用于文件操作的类和函数,方便开发人员在Windows平台上进行文件的读写和管理。下面是一些常用的MFC文件操作相关的功能和类。 1. CFile类:CFile类是MFC提供的用于文件操作的基本类,它封装了文件的打开、读写、关闭等功能。通过CFile类的派生类CStdioFile可以实现对文本文件的读写操作。通过CFile类的派生类CMemFile可以在内存创建文件。 2. CString类:CString类是MFC用于处理字符串的类,可以将字符串写入文件或从文件读取字符串。通过CFile类的WriteString()和ReadString()函数可以方便地进行字符串的写入和读取。 3. CArchive类:CArchive类使开发人员能够方便地对对象进行序列化和反序列化操作。通过CArchive类的派生类CFile和CMemFile可以将对象保存到文件或从文件读取对象。 4. 文件打开对话框:MFC提供了CFileDialog类,可以通过它打开一个文件选择对话框,选择需要进行操作的文件路径和文件名。 5. 文件属性操作:通过CFile类的相关函数可以获取文件的属性信息,如文件的大小、创建时间、修改时间等。 6. 文件夹和目录操作:MFC通过CFileFind类提供了对文件夹和目录的操作,可以遍历文件文件或子文件夹。 除了上述基本的文件操作类和函数外,MFC还提供了一系列的扩展类和函数,用于处理文件的权限、文件夹的创建和删除等操作。开发人员可以根据具体的需求选择合适的类和函数进行文件操作。但需要注意的是,VC 6.0已经较为古老,一些新的文件操作方式和技术,如C++的文件流和Boost库等,可能在VC 6.0并不适用。因此建议尽量使用更新的版本进行文件操作。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值