MFC中关于文件的读取和存储(使用CFile与CFileDialog类)

时间:2022-05-22 20:21:04
MFC中关于文件的读取和存储(使用CFile与CFileDialog类)

    在这里我记录一下如何读取和存储一个文件!
   这里以读取一个txt文档为例。
   我首先建立了一个单文档应用程序,在View处理LBUTTONDOWN的消息,即左鼠标键按下,打开一个文件。当然这里是为了图方便省事!
   处理代码如下:
void CSDIView::OnLButtonDown(UINT nFlags, CPoint point)   
{  
    // TODO: Add your message handler code here and/or call default  
      
    CFileDialog  fileDlg(TRUE);//这里的true表示是文件打开对话框,FALSE的话会变成文件保存对话框  
  
    fileDlg.m_ofn.lpstrFilter = "Text Files(*.txt)\0*.txt\0All files(*.*)\0*.*\0\0";//这里是文件过滤符  
    if (IDOK == fileDlg.DoModal())  
    {  
        CFile iifile(fileDlg.GetFileName(), CFile::modeRead);  
          
        int nLen = iifile.GetLength();//首先获取数据长度  
        char *pBuf = new char[nLen + 1];//在堆里开辟一块内存  
        pBuf[nLen] = 0;//最后一个字符置零,方便输出  
        iifile.Read(pBuf, nLen);//读出字符  
        MessageBox(pBuf);//通过对iifile读取字符  
        delete []pBuf;//删除不需要的内存,防止内存泄露  
    }  
      
      
    CView::OnLButtonDown(nFlags, point);  
}  




   在这里解释一下函数就可以了!
   1.CFile(LPCTSTR lpFileName,UINT nOpenFlags); 
       Throw(CFileException);


       lpFileName:文件名称,可以是相对路径,绝对路径或者网络路径
       nOpenFlags:文件打开方式,有以下几种:
       CFile::modeCreate 构造新文件,如果文件存在,则长度变为0
       CFile::modeNoTruncate 该属性和modeCreate联合使用,可以达到如下效果:如果文件存在,则不会将文件的长度置为0,如果不存在,则会由modeCreate属性来创建一个新文件。
       CFile::modeRead   以只读方式打开文件
       CFile::modeWrite   以写方式打开文件
       CFile::modeReadWrite 以读、写方式打开文件
       CFile::modeNoInherit 阻止文件被子进程继承
       CFile::shareDenyNone 不禁止其它进程读写访问文件,但如果文件已经被其它进程以兼容模式打开,则创建文件失败。
       CFile::shareDenyRead   打开文件,禁止其它进程读此文件,如果文件已经被其它进程以兼容模式打开,或被其它进程读,则create失败。
       CFile::shareDenyWrite 打开文件,禁止其它进程写此文件,如果文件已经被其它进程以兼容模式打开,或被其它进程写,则create失败。
       CFile::shareExclusive   以独占模式打开文件,禁止其它进程对文件的读写,如果文件已经被其它模式打开读写(即使是当前进程),则构造失败。
       CFile::shareCompat    此模式在32位MFC中无效,此模式在使用CFile::Open时被映射为CFile::ShareExclusive。
       CFile::typeText        对回车、换行设置特殊进程(仅用于派生类)
       CFile::typeBinary      设置二进制模式(仅用于派生类)
       当然很属性都不常用,常用的就CFile::modeRead(读),CFile::modeCreate(创建),CFileWrite(写).
       2.virtual UINT Read(void* lpbuf,UINT nCount);
throw(CFileException);
   该函数返回读到缓冲区的字节长度,注意:对于读入到文件尾部,则返回的字节长度会小于、等于nCount的值。该函数表示从当前位置读入nCount个字节的内容到lpbuf缓冲区。
   上面的的函数先在堆里分配出一块内存做缓冲区,然后写到缓冲区里面!最后一定要记得删除那块数据,C++不会帮你删除,只能自己动手!
       3.CFileDialog::CFileDialog( BOOL bOpenFileDialog, LPCTSTR lpszDefExt = NULL, LPCTSTR lpszFileName = NULL, DWORD dwFlags = OFN_HIDEREADONLY | OFN_OVERWRITEPROMPT, LPCTSTR lpszFilter = NULL, CWnd* pParentWnd = NULL )
    这个函数是CFileDialog的构造函数,很多都已经有默认参数了,当然,自己亦可以修改!
       bOpenFileDialog 为TRUE则显示打开对话框,为FALSE则显示保存对话文件对话框。 
       lpszDefExt 指定默认的文件扩展名。 
       lpszFileName 指定默认的文件名。 
       dwFlags 指明一些特定风格。如果在参数中指定了“OFN_ALLOWMULTISELECT”风格,则在此对话框中可以进行多选操作。
       lpszFilter 是最重要的一个参数,它指明可供选择的文件类型和相应的扩展名。参数格式如: 
"Chart Files (*.xlc)|*.xlc|Worksheet Files (*.xls)|*.xls|Data Files (*.xlc;*.xls)|*.xlc; *.xls|All Files (*.*)|*.*||";文件类型说明和扩展名间用 | 分隔,同种类型文件的扩展名间可以用 ; pos ) 对于选择了多个文件的情况得到下一个文件位置,并同时返回当前文件名。但必须已经调用过POSITION CFileDialog::GetStartPosition( )来得到最初的POSITION变量。