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();

 

 

    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(strPath, CFile::modeRead);

    while (File.ReadString(strLine))//while循环读取每一行字符

    {

         CString strIP;

         pDlg->GetDlgItem(IDC_EDIT_IP)->GetWindowText(strIP);

         int  n= strLine.Find(strIP);

         if (n != -1)

         {

             //

             CStdioFile f;

             f.Open(_T("E:\\FindLog.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结构来描述文件的属性,其定义如下:

structCFileStatus

{

CTime m_ctime; // 文件创建时间

CTimem_mtime; // 文件最近一次修改时间

CTimem_atime; // 文件最近一次访问时间

LONGm_size; // 文件大小

BYTEm_attribute; // 文件属性

BYTE_m_padding; // 没有实际含义,用来增加一个字节

TCHAR m_szFullName[_MAX_PATH]; //绝对路径

#ifdef_DEBUG

//实现Dump虚拟函数,输出文件属性

void Dump(CDumpContext& dc) const;

#endif

};

例如:

CFileStatusstatus;

pFile->GetStatus(status);

#ifdef_DEBUG

status.dump(afxDump);

#endif

--------------------------------------------------------------------------------

CFileDialog

打开对话框

--------------------------------------------------------------------------------

    CFileDialog inDlg(TRUE,NULL, NULL, NULL, _T("自定义文件类型 (*.txt)|*.txt|所有文件 (*.*)|*.*||"),NULL);

//true为打开,false为另存为

//CFileDialog dlg(TRUE,NULL,NULL,OFN_HIDEREADONLY|OFN_OVERWRITEPROMPT,为自定义对话框一般这里为null比较好看

        "AllFiles(*.*)|*.*| |",AfxGetMainWnd());

//指针类型打开CFileDialog *inDlg=newCFileDialog(...);

    inDlg.m_ofn.lpstrTitle= _T("打开自定义文件"); //标题

    if (inDlg.DoModal() == IDOK)

    {

        strTemp02 = inDlg.GetFileName();

        strTemp03= inDlg.GetPathName();

        strPath= strTemp03;

        //

        int iResults2 = MessageBox(_T("您确定要搜索 ") + strTemp02 +_T("文件吗?"),_T("搜索文件选择"),MB_YESNOCANCEL | MB_ICONINFORMATION);

        if (iResults2 == IDNO || iResults2 == IDCANCEL)

        {

            return;

        }

        CTime time = CTime::GetCurrentTime();

        CString strLog = time.Format("%Y-%m-%d %H:%M:%S  ");

        m_nSearchLog.ReplaceSel(strLog+ _T("搜索中......\r\n"));

    }

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

// 打开文件

void CConverToolDlg::OnBnClickedButtonOpen()

{

    // 支持多选

    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);

         }

 

    }}

 

打开目录

// 输出目录

void CConverToolDlg::OnBnClickedButtonSave()

{

    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();            // 释放接口

    }

}

 

 

保存对话框

--------------------------------------------------------------------------------

voidCOpenAndSaveDlg::OnButton2()

{

    CFileDialogdlg(FALSE,NULL,NULL,OFN_HIDEREADONLY|OFN_OVERWRITEPROMPT,

        "AllFiles(*.*)|*.*| |",AfxGetMainWnd());

    CStringstrPath,strText="";

    charwrite[1000];

    if(dlg.DoModal()==IDOK)

    {

        strPath=dlg.GetPathName();

        if(strPath.Right(4)!=".txt")

            strPath+=".txt";

    }

    CFilefile(_T(strPath),CFile::modeCreate|CFile::modeWrite);

    m_RichEdit.GetWindowText(strText);

    strcpy(write,strText);

    file.Write(write,strText.GetLength());

    file.Close();

}

--------------------------------------------------------------------------------

智能推荐

注意!

本站转载的文章为个人学习借鉴使用,本站对版权不负任何法律责任。如果侵犯了您的隐私权益,请联系我们删除。



 
© 2014-2019 ITdaan.com 粤ICP备14056181号  

赞助商广告