MFC提供了一个文件操作的基类CFile,这个类提供了一个没有缓存的二进制格式的磁盘输入输出功能。通过他的派生类可以间接的支持文本、文件、内存文件等。
打开文件
通过对CFile类的初始化,即可完成文件的打开
CFile类的其中一个构造函数:
CFile(LPCTSTR lpszFileName, UINT nOpenFlags);
- 参数lpszFileName
表示文件名
- 参数nOpenFlage
表示打开方式
CFile打开文件模式总结,里面有几种模式可能是SDK中的高级模式,使用频率不高,不过应该可以在某种场合满足用户的一些高级要求。因为我没有用到过,所以可能翻译的理解上有偏差。如果以后有幸能理解透彻,再来斟酌修改吧。
打开模式 | 含义 |
CFile::modeCreate | 直接构建创建一个新文件。如果该文件已经存在,则文件内容自动被清零。 |
CFile::modeNoTruncate | 该值一般modeCreate组合使用。如果创建的文件已经存在,那么它不会被清零。因而该文件能可靠的打开,或者新建一个文件或者打开一个现存文件。这对于打开一个可能存在可能不存在的设置文件十分有用。该选项通用可用于CStdioFile。 |
CFile::modeRead | 以只读方式打开文件 |
CFile::modeReadWrite | 以可读可写方式打开文件。 |
CFile::modeWrite | 以只写方式打开文件。 |
CFile::modeNoInherit | 阻止文件被子进程继承。 |
CFile::shareDenyNone | 以不拒绝其他进程对文件的读写方式打开。如果文件已经被其他进程以compatibility模式打开,则文件创建失败。 |
CFile::shareDenyRead | 以拒绝其他进程对文件读的方式打开。如果文件已经被其他进程以compatibility模式或读打开,则文件创建失败。 |
CFile::shareDenyWrite | 以拒绝其他进程对文件写的方式打开。如果文件已经被其他进程以compatibility模式或写打开,则文件创建失败。 |
CFile::shareExclusive | 以exclusive方式打开,拒绝其他进程对文件的读写。如果该文件已经被不管任何进程以任何方式打开都构建失败。 |
CFile::shareCompat | 此标志在32位MFC中无效。该标志当使用CFile::Open时映射为CFile::shareExclusive。 |
CFile::typeText | 以文本方式打开。 |
CFile::typeBinary | 以二进制方式打开(只在派生类中使用)。 |
CFile::osNoBuffer | 系统打开文件不开系统缓存。可查看Platform SDK中CreateFile的FILE_FLAG_NO_BUFFERING。 |
CFile::osWriteThrough | 通过任何快速缓存并直接写磁盘的标志。可查看Platform SDK中CreateFile的FILE_FLAG_WRITE_THROUGH。 |
CFile::osRandomAccess | 随机访问文件方式。系统使用这种方式优化文件缓冲区。 |
CFile::osSequentialScan | 从开头到结尾的顺序访问文件方式。系统使用这种方式来优化文件缓冲区。可查看Platform SDK中CreateFile的FILE_FLAG_SEQUENTIAL_SCAN。 |
写文件
写文件时,需调用类的Write函数
void CFile::Write(const void* lpBuf, UINT nCount);
- 参数lpBuf
表示写入数据的缓冲区
- 参数nCount
表示写入数据的字符数
读文件
读文件时,调用类的Read函数
UINT CFile::Read(void* lpBuf, UINT nCount);
- 参数lpBuf
表示接收读取数据的缓冲区
- 参数nCount
表示要读取数据的字符数
- 返回值
返回读取到缓冲区的字节数
在文件操作完毕后需要调用Close函数来关闭文件,如果在销毁对象之前尚未关闭文件,析构函数将为您关闭该文件。如果使用new
在堆上分配对象,则必须在关闭 file.setsto 后将其删除。
获取文件长度
我们可以使用CFile类的GetLength函数来获取文件的长度
virtual ULONGLONG CFile::GetLength() const;
该函数可以返回我们打开的文件长度
Example
代码示例:
写文件时,使用CFile::modeCreate和CFile::modeWrite模式初始我们的CFile类
//mfc文件操作
void CMyFileCFileView::OnMFCWriteFile() {
//MFC提供的文件操作时CFile类
CFile file(L"4.txt", CFile::modeCreate | CFile::modeWrite); //CFile提供的其中一个构造函数
file.Write("Hello World", strlen("Hello World"));
file.Close();
}
读文件,首先获得文件的大小,根据大小new一个字符缓冲区接收读取的文件内容。
//读文件
void CMyFileCFileView::OnMFCReadFile() {
CFile file(L"4.txt", CFile::modeRead); //CFile提供的其中一个构造函数
char* pBuf;
//获取文件大小
DWORD dwFileLen = file.GetLength();
pBuf = new char[dwFileLen + 1];
file.Read(pBuf, dwFileLen);
pBuf[dwFileLen] = 0;
file.Close();
USES_CONVERSION;
CString strBuf = A2W(pBuf);
MessageBox(strBuf);
}
运行结果:
CFileDialog 类
有时候我们希望能动态更改文件的读写位置,那么就可以使用CFileDialog类来实现这一功能。
CFileDialog类封装了Windows常用的文件对话框。常用的文件对话框提供了一种简单的与Windows标准相一致的文件打开和文件存盘对话框功能。
下面代码示例了一种简单的文件存盘和打开对话框功能。文件的读取和写入使用的是MFC的文件读写。
文件保存:
下面这段程序更改了对话框标题,并限定保存的文件类型为.txt文本类型,当用户点击对话框确定按钮后,程序会读取用户输入的文件名,并将其保存为.txt类型。最后向文本内写入"Tom and Jerry"
void CMyFileCFileView::OnFileDialog() {
CFileDialog fileDlg(FALSE);
fileDlg.m_ofn.lpstrTitle = L"提示";//改标题
fileDlg.m_ofn.lpstrFilter = _T("Text Files(*.txt)\0*.txt\0All Files(*.*)\0*.*\0\0");
fileDlg.m_ofn.lpstrDefExt = L"txt";
if (IDOK == fileDlg.DoModal()) {
CFile file(fileDlg.GetFileName(), CFile::modeCreate | CFile::modeWrite);
USES_CONVERSION;
char *szBuf = T2A(fileDlg.GetFileName());
file.Write("Tom and Jerry", strlen("Tom and Jerry"));
file.Close();
}
}
文件读取:
下面这段程序更改了对话框标题,并限定读取的文件类型为.txt文本类型,当用户点击对话框确定按钮后,程序会读取用户输入的文件名,并读取这个文件内容,之后通过消息框显示出来。
void CMyFileCFileView::OnFileDialogRead() {
CFileDialog fileDlg(TRUE);
fileDlg.m_ofn.lpstrTitle = L"提示";//改标题
fileDlg.m_ofn.lpstrFilter = _T("Text Files(*.txt)\0*.txt\0All Files(*.*)\0*.*\0\0");
if (IDOK == fileDlg.DoModal()) {
CFile file(fileDlg.GetFileName(), CFile::modeRead);
char* pBuf;
DWORD dwFileLen = file.GetLength();
pBuf = new char[dwFileLen + 1];
pBuf[dwFileLen] = 0;
file.Read(pBuf, dwFileLen);
USES_CONVERSION;
CString strBuf = A2W(pBuf);
MessageBox(strBuf);
file.Close();
}
}
CFileDialog的构造函数
explicit CFileDialog(
BOOL bOpenFileDialog,
LPCTSTR lpszDefExt = NULL,
LPCTSTR lpszFileName = NULL,
DWORD dwFlags = OFN_HIDEREADONLY | OFN_OVERWRITEPROMPT,
LPCTSTR lpszFilter = NULL,
CWnd* pParentWnd = NULL,
DWORD dwSize = 0,
BOOL bVistaStyle = TRUE
);
- 参数bOpenFileDialog
指定要创建的对话框类型,TRUE表示文件打开对话框,FALSE表示文件另存为对话框
- 参数lpszDefExt
表示默认文件扩展名
- 参数lpszFileName
表示显示在“文件名”框中的初始文件名
- 参数 dwFlags
用于设置对话框的标志组合,例如标题。
- 参数lpszFilter
指定文件的筛选器。如果指定文件筛选器,则只有与筛选条件匹配的文件才会显示在“文件”列表中。
- 参数pParentWnd
指定文件对话框的父窗口或所有者的窗口指针
- 参数dwSize
结构的大小。此值取决于操作系统版本。默认大小 0 表示 MFC 代码将根据运行程序的操作系统版本确定要使用的正确对话框大小。