⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 cfile.txt

📁 CString用法 Windows服务包括四大部分: 一
💻 TXT
📖 第 1 页 / 共 3 页
字号:

文件操作的方法 

使用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 + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -