各种关于文件的操作在程序设计中是十分常见,因而熟练的掌握文件操作是十分重要的。
(1)文件的查找
当对一个文件操作时,如果不知道该文件是否存在,就要首先进行查找。MFC中有一个专门用来进行文件查找的类CFileFind,使用它可以方便快捷地进行文件的查找。下面这段代码演示了这个类的最基本使用方法。
CString strFileTitle;
CFileFind finder;
BOOL bWorking = finder.FindFile("C://windows//sysbkup//*.cab");
while(bWorking)
{
bWorking=finder.FindNextFile();
strFileTitle=finder.GetFileTitle();
}
(2)文件对话框的使用
让用户选择文件进行打开和存储操作时,就要用到文件打开/保存对话框,MFC的类CFileDialog用于实现这种功能。首先构造一个对象并提供相应的参数,构造函数原型如下:
CFileDialog::CFileDialog(
BOOL bOpenFileDialog, //为TRUE则显示打开对话框,为FALSE则显示保存对话文件对话框
LPCTSTR lpszDefExt = NULL, //默认的文件扩展名
LPCTSTR lpszFileName = NULL, //默认的文件名
DWORD dwFlags = OFN_HIDEREADONLY | OFN_OVERWRITEPROMPT, //设定风格
LPCTSTR lpszFilter = NULL, //列出可供选择的文件类型和相应的扩展名
CWnd* pParentWnd = NULL //父窗口句柄指针
);
该类还有一些经常用到的成员函数。创建文件对话框可以使用DoModal(),在返回OK后可以利用下面的函数得到用户选择:
CString CFileDialog::GetPathName( ) 得到完整的文件名,包括目录名和扩展名如:c:/test/test1.txt
CString CFileDialog::GetFileName( ) 得到完整的文件名,包括扩展名如:test1.txt
CString CFileDialog::GetExtName( ) 得到完整的文件扩展名,如:txt
CString CFileDialog::GetFileTitle ( ) 得到完整的文件名,不包括目录名和扩展名如:test1
(3)文件的读写
文件的读写非常重要,下面将重点进行介绍。文件读写的最普通的方法是直接使用CFile进行,如文件的读写可以使用下面的方法。
对文件进行读操作:
char sRead[2];
CFile mFile(_T("user.txt"),CFile::modeRead);
if(mFile.GetLength()<2)
return;
mFile.Read(sRead,2);
mFile.Close();
对文件进行写操作:
CFile mFile(_T("user.txt "), CFile::modeWrite|CFile::modeCreate);
mFile.Write(sRead,2);
mFile.Flush();
mFile.Close();
(4)大于64K文件的读写
VC中访问大于65535字节的缓冲区需要Huge型指针,而在CFile类中,使用的是Far型的指针。由于Far型指针不具有跨段寻址的能力,因此限制了一次文件读写的长度小于65535字节。在MFC的CFile类中提供了两个未载入文档的函数,函数原型如下:
DWORD CFile::ReadHuge(void FAR *lpBuffer,DWORD dwCount);
void CFile::WriteHuge(const void FAR*lpBuffer,DWORD dwCount);
在这两个函数内部使用的都是Huge型指针来对传递的缓冲区进行寻址,因此可以读写大于65535字节的巨型数据。
对于ReadHuge()和WriteHuge()函数需要的巨型缓冲区可以使GobalAlloc()来创建。实例:
{
CString Namel("data1.dat");
CString Name2("data2.dat");
CFile MyFilel(Namel,CFile::modeRead);
CFile MyFile2(Name2,CFile::modeCreate|CFile::modeWrite);
DWORD Length=MyFile1.GetLength();
void far *p=GlobalAlloc(0,Length);
if(p=NULL)
{
AfxMessageBox("Alloc memory error!");
}
MyFile1.ReadHuge(p,Length);
MyFile2.WriteHuge(p,Length);
MyFile1.Close();
MyFile2.Close();
AfxMessageBox("File Copy Succeed!");
}
(5)文件的复制、删除等
MFC中没有提供直接进行这些操作的功能,因而要使用SDK。SDK中的文件相关函数常用的有CopyFile()、CreateDirectory()、DeleteFile()、MoveFile()。
(6)综合实例
结合以上文件和文件对话框的,举一个打开并载入文件的操作实例。
CFile Filetemp; //文件
CFileDialog BinFile(
TRUE,
"FILE",
"*.bin",
OFN_HIDEREADONLY,
NULL,
NULL); //创建一个文件对话框
if (BinFile.DoModal() == IDOK) //如果点OK确认
{
CString PathName = BinFile.GetPathName(); //获得文件的全路径
if (Filetemp.Open(PathName,CFile::modeRead)) //如果打开文件成功
{
int len = Filetemp.GetLength(); //获得流文件长度
char *DataSource = (char*)malloc(len);
memset(DataSource,0,len); //分配内存
Filetemp.Read(DataSource,len); //将文件内容读入内存
OnSendOutFile(DataSource,len); //发送文件数据
free(DataSource);
DataSource = NULL; //如果使用完毕释放掉内存
}
}
参考原文:http://blog.youkuaiyun.com/zhuang_rui/archive/2007/09/28/1804875.aspx
参考原文:http://www.busfly.cn/post/32.html
参考原文:http://blog.youkuaiyun.com/sgdgoodboy/archive/2008/03/26/2221005.aspx