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(); |
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();
}
}
--------------------------------------------------------------------------------
CMemFile把一块内存当作一个文件来操作,所以,它没有打开文件的操作,而是设计了Attach和Detach用来分配或者释放一块内存。相应地,它提供了Alloc、Free虚拟函数来操作内存文件,它覆盖了Read、Write来读写内存文件。
为了方便文件查找,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 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();
}
--------------------------------------------------------------------------------
本站转载的文章为个人学习借鉴使用,本站对版权不负任何法律责任。如果侵犯了您的隐私权益,请联系我们删除。