简介本文介绍MFC文件操作快速入门,感兴趣的朋友可以参考一下。

Cfile二进制读写

CFile rfile, wfile;
CString strPath1 = _T("C:\\Users\\Administrator\\Desktop\\test1.txt");
if (!rfile.Open(strPath1, CFile::modeRead))
{
	return;
}
CString strPath2 = _T("C:\\Users\\Administrator\\Desktop\\test2.txt");
if (!wfile.Open(strPath2, CFile::modeCreate | CFile::modeWrite))
{
	return;
}
BYTE buf[1024];
UINT readed;
while ((readed = rfile.Read(buf, 1024)) > 0)
{
     wfile.Write(buf, readed);
}

rfile.Close();
wfile.Close();

读取前面5字节:

CFile rfile, wfile;
CString strPath1 = _T("C:\\Users\\Administrator\\Desktop\\test1.txt");
if (!rfile.Open(strPath1, CFile::modeRead))
{
	return;
}

CString strPath2 = _T("C:\\Users\\Administrator\\Desktop\\test2.txt");
if (!wfile.Open(strPath2, CFile::modeCreate | CFile::modeWrite))
{
	return;
}

BYTE buf[1024];
UINT readed;
CString strKey = _T("aaaaa");
// 读取前面5字节
if ((readed = rfile.Read(buf, 5)) > 0)
{
	char ch[6] = { 0 };
	memcpy(ch, &(buf[0]), 5);
	CString strCurKey(ch);
	// 关键字比较
	if (strCurKey != strKey)
	{
		::MessageBox(GetSafeHwnd(), _T("关键字匹配不成功,返回!"), _T("系统提示"), MB_OK);
		return;
	}
	else
	{
		::MessageBox(GetSafeHwnd(), _T("关键字匹配成功,开始转换!"), _T("系统提示"), MB_OK);
	}
}

// 指针移动10字节,去掉前面10字节
rfile.Seek(5, CFile::begin);
while ((readed = rfile.Read(buf, 1024)) > 0)
{
	wfile.Write(buf, readed);
}

rfile.Close();
wfile.Close();

CFile的派生类

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。

使用例子:

CStdioFile File(_T("C:\\1.txt"), CFile::modeRead);
// while循环读取每一行字符
while (File.ReadString(strLine))
{
	CString strKey = _T("C++");
	int  n = strLine.Find(strKey);
	if (n != -1)
	{
		CStdioFile f;
		f.Open(_T("C:\\2.txt"), CFile::modeCreate | CFile::modeRead | CFile::typeText | CFile::modeWrite | CFile::modeNoTruncate);
		f.SeekToEnd();
		f.GetPosition();
		f.WriteString(strLine + "\n");
		f.Close();
	}
}

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

CFileDialog

打开对话框

CFileDialog inDlg(TRUE, NULL, NULL, NULL, _T("自定义文件类型 (*.txt)|*.txt|所有文件 (*.*)|*.*||"), NULL);
inDlg.m_ofn.lpstrTitle = _T("打开自定义文件");  // 标题
if (inDlg.DoModal() == IDOK)
{
	strTemp1 = inDlg.GetFileName();
	strTemp2 = inDlg.GetPathName();
}

打开对话框--选择多个文件

// 支持多选
CFileDialog FileDlg(TRUE, NULL, NULL, OFN_OVERWRITEPROMPT | OFN_HIDEREADONLY | OFN_ALLOWMULTISELECT, _T("所有文件 (*.*)|*.*||"), NULL);
FileDlg.m_ofn.lpstrTitle = _T("请选择需要转换的文件");  // 标题

//TCHAR *pBuffer = new TCHAR[MAX_PATH * 20];// 最多允许同时打开20个文件
//FileDlg.m_ofn.lpstrFile = pBuffer;
//FileDlg.m_ofn.nMaxFile = MAX_PATH * 20;
// FileDlg.m_ofn.lpstrFile[0] = '\0';

if (FileDlg.DoModal() == IDOK)
{
	CString strCurName = _T("");
	CString strCurPath = _T("");
	POSITION nPos = FileDlg.GetStartPosition();

	// 读取选中文件
	while (NULL != nPos)
	{
		strCurPath = FileDlg.GetNextPathName(nPos);
		// 获取文件名
		int nLength = strCurPath.GetLength();
		for (int i = nLength - 1; i > 0; --i)
		{
			// 遇到字符'\'跳出循环,注意写法
			if ('\\' == strCurPath.GetAt(i))
			{
				strCurName = strCurPath.Right(nLength - i - 1);
				break;
			}
		}
		AfxMessageBox(strCurName);
	}
}

打开目录

HWND hwnd = GetSafeHwnd();   // 得到窗口句柄
CString strOutPath = _T(""); // 文件路径            
LPMALLOC pMalloc;
if (::SHGetMalloc(&pMalloc) == NOERROR) // 取得IMalloc分配器接口
{
	BROWSEINFO        bi;
	TCHAR             pszBuffer[MAX_PATH];
	LPITEMIDLIST pidl;
	bi.hwndOwner = hwnd;
	bi.pidlRoot = NULL;
	bi.pszDisplayName = pszBuffer;
	bi.lpszTitle = _T("选择输出文件夹"); // 选择目录对话框的上部分的标题
	// 添加新建文件夹按钮 BIF_NEWDIALOGSTYLE
	bi.ulFlags = BIF_NEWDIALOGSTYLE | BIF_RETURNONLYFSDIRS | BIF_RETURNFSANCESTORS;
	bi.lpfn = NULL;
	bi.lParam = 0;
	bi.iImage = 0;
	if ((pidl = ::SHBrowseForFolder(&bi)) != NULL)  // 取得IMalloc分配器接口
	{
		if (::SHGetPathFromIDList(pidl, pszBuffer)) // 获得一个文件系统路径
		{
			strOutPath = pszBuffer;
		}
		pMalloc->Free(pidl);  // 释放内存
		MessageBox(strOutPath);
	}
	pMalloc->Release();// 释放接口
}

保存对话框

CFileDialog dlg(FALSE, NULL, NULL, OFN_HIDEREADONLY | OFN_OVERWRITEPROMPT, "AllFiles(*.*)|*.*| |", AfxGetMainWnd());
CString strPath, strText;
char write[1000];
if (dlg.DoModal() == IDOK)
{
	strPath = dlg.GetPathName();
	if (strPath.Right(4) != ".txt")
		strPath += ".txt";

}
CFile file(_T(strPath), CFile::modeCreate | CFile::modeWrite);
m_RichEdit.GetWindowText(strText);
strcpy(write, strText);
file.Write(write, strText.GetLength());
file.Close();


更多为你推荐