cfile.txt

来自「CString用法 Windows服务包括四大部分: 一」· 文本 代码 · 共 927 行 · 第 1/3 页

TXT
927 行
字号

文件操作的方法 

使用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的界面可以得到好的移植性。


MFC的文件类 

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


CFile的结构 


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 };


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用来保存文件名。


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 
 

 


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 

⌨️ 快捷键说明

复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?