本篇博文主要简要介绍用CFileDialog类从指定目录获取文件路径,并对文件进行读写。对文件的操作介绍了两个类,非别是FILE和CStdioFile类。
首先用MFC向导创建一个对话框程序,然后声明需要使用的变量
private:
CFileDialog *m_filedlg; //文件对话框
CString strPath; //保存文件路径
FILE *m_file;
CStdioFile m_fileRead;
然后定义“打开文件”按钮的响应函数
void CCfileDlgDlg::OnBtnOpenFile()
{
// TODO: Add your control notification handler code here
CString fileType = "源文件(*.cpp;*.h)|*.txt;*.h|动态库文件(*.dll)|*.dll||";
char logPath[50] = "c:\\logfile.txt";
m_filedlg = new CFileDialog(TRUE, NULL, "打开文件", OFN_HIDEREADONLY | OFN_OVERWRITEPROMPT | OFN_ALLOWMULTISELECT, fileType);
if (IDOK == m_filedlg->DoModal())
{
//将选择的多个文件的路径写入到c:\\logfile.txt
POSITION pos = m_filedlg->GetStartPosition();
m_file = fopen((const char*)logPath, "a");
while(TRUE)
{
strPath = m_filedlg->GetNextPathName(pos)+"\n";
if (NULL != pos)
{ //此文件不是最后一个被选中的文件
fputs(strPath.GetBuffer(0), m_file);
}
else
{
//最后一个被选中的文件
fputs(strPath.GetBuffer(0), m_file);
fclose(m_file);
break;
}
}
}
}
然后创建“读文件”按钮的响应函数,将选择的文件读入到下面的编辑控件中,注意,由于对话框添加了一个RichEdit控件,可能导致对话框无法显示。
解决方法:在C**App类的成员函数InitInstance中添加AfxInitRichEdit(); //调用RichEdit的初始化函数
void CCfileDlgDlg::OnBtnRead()
{
// TODO: Add your control notification handler code here
m_filedlg = new CFileDialog(TRUE, NULL, "打开文件", OFN_HIDEREADONLY | OFN_OVERWRITEPROMPT, "文本文件(*.txt)|*.txt||");
if (IDOK == m_filedlg->DoModal())
{
//获取选中文件的路径
CString path = m_filedlg->GetPathName();
CString strData;
if (m_fileRead.Open(path, CFile::modeRead))
{
//得到文件大小
int len = m_fileRead.GetLength();
char *buff = new char[len+1];
//将文件内容读到内存
m_fileRead.Read(buff, len);
buff[len] = '\0';
strData.Format("%s", buff);
}
else
{
MessageBox("open file failure!");
return;
}
SetDlgItemText(IDC_RICHEDIT1, strData);
}
}
运行程序,点击读文件
选中文件后,编辑框显示文件内容如下: