MFC文件操作笔记整理

    xiaoxiao2021-03-26  35

    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=new CFileDialog(...);

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

    }

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

    转载请注明原文地址: https://ju.6miu.com/read-350107.html

    最新回复(0)