文件基本操作
预备知识——MFC文件操作
1.计算机是如何管理自身所存放着的大量的信息的呢?
硬盘上的信息是以文件的形式被管理的。
2.为什么要在程序中使用文件?通常,程序中的数据在程序运行结束之后,就会从内存中清除,再次运行程序时不会自动出现。在编制程序的过程中不可避免的会遇到将某些数据永久保存的问题,当程序关闭后,依然可以使用这些数据,这时就需要进行文件操作。
3.文件类型(Visual C++处理的文件通常分为两种)文本文件:只可被任意文本编辑器读取ASCII文本。
二进制文件:指对包含任意格式或无格式数据的文件的统称。
这里只介绍文本文件的读写,INI文件也属于文本文件的范畴,且INI文件的结构和用途与普通的文本文件不同,所以会单独介绍。写
许多系统,出于安全或其他原因,常常要求随时对键盘进行监控,利用Hook(钩子)技术编写的应用程序能够很好地达到这个目的。即在软件运行过程中,用户在键盘上的按键操作会被记录下来,这样对维护软件的正常运行非常有利。
Hook技术在很多特殊软件中广泛应用,如,金山词霸的“取词”功能,就用到了Hook计技术。
钩子的本质是一段用以处理系统消息的程序,通过系统调用,将其挂入系统。钩子的种类很多,每种钩子可以截获并处理相应的消息,每当特定的消息发出,在到达目的窗口之前,钩子程序先行截获该消息、得到对此消息的控制权。此时在钩子函数中就可以对截获的消息进行加工处理,甚至可以强制结束消息的传递。
从钩子的本质来看,可以优先截获操作系统的各种消息进行处理,所以它几乎无所不能,因为windows的应用程序都是基于消息驱动的,应用程序的操作都依赖于它所得到的消息的类型及内容。
如果Hook过程在应用程序中实现,若应用程序不是当前窗口时,该Hook就补齐作用;如果Hook在DLL中实现,程序在运行中动态调用它,它能实时对系统进行监控。根据需要,我们采用的是在DLL中实现Hook的方式。(应用程序exe和DLL的区别所在)
5.文本文件存储管理字符被计算机处理时都是以二进制代码的形式出现的,即一个字符对应一个8位二进制数,这种二进制码的集合就是所谓的ASCII码。
基本的ASCII码有128个,最高位都是0,对应的十进制数是0-127。键盘上的字符,如英文字母、数字和一些常用符号,使用基本ASCII部分。
扩展的ASCII码有128个,最高位是1,对应的十进制数是128-255。一些制表符和其他符号使用扩展的ASCII码部分。
6.正确的文本文件读写过程1.定义文件变量;2.打开指定的文件;3.向从文本文件中写入信息;4.从文本文件中读取信息;5.关闭文件
7.错误的文本文件读写过程在读写文本文件的时候,最常见的错误是---操作文件不存在。这种错误产生的典型原因有:
1).路径错误由于将文件变量与一个绝对路径的文件名关联,而程序的数据通常存储在相对路径下,所以一旦相对路径和相对路径不一致时,就会出错。
2).操作文件不存在如果应用程序所有路径下面不存在MyFile.txt文件,那么在WriteString写入信息时就会出错。
3).超越文件权限进行读写操作在打开文件的过程中,通过参数指定了文件的读写权限,如果读写的操作没有和相应的权限对应,就会出现错误。
8.INI文件INI文件的读写
配置设置文件(INI)文件是windows操作系统中的一种特殊的ASCII文件,以ini为文件扩展名。该文件也被称为初始化文件initialization file和概要文件profile,通常应用程序可以拥有自己的配置设置文件来存储状态信息。一般来说私有的配置设置文件比较小,这样可以减少程序在初始化时读取配置文件时的信息量,从而提高程序的启动速度、提高应用程序和系统的性能。
如果带存取的信息涉及到windows系统环境或是其他应用程序时,就必须在windows系统的配置文件win.ini中记录并在访问的同时发送WM_WININICHANGE消息给所有的顶层窗口,通知其他的程序系统配置文件已做了更改。但由于win.ini中不仅记录了系统的有关信息,也存储着许多其他应用软件的配置数据,所以访问的数据量要远比私有配置文件大的多。
1).认识上的误区一:写文件路径的时候写成诸如C:\Info的形式,实际上在visual C++中,文件名的路径中必须为\\,因为在visual C++中\\才表示一个\,所以正确的格式应改为C:\\Info.
2).认识上的误区二:因为经常需要把INI文件放在程序所在目录,所以在写INI文件的函数中直接将lpFileName参数设置为文件名,如“student.ini”。这是不正确的做法,打开INI文件的时候,如果文件名没有指明路径的话,那么这个INI文件会存储在windows目录中,而不是在应用程序的当前目录中。解决办法是lpFileName参数设置为“.\\student.ini”。
正文——MFC:文件和ini文件操作
1.文件的读取与写入
新建一个MFC单文档应用程序(工程名取:File),打开菜单资源新建一个文件菜单,并在其下添加以下菜单项(ID:IDM_FILE_READ,Caption:读取)和(ID:IDM_FILE_WRITE,Caption:写入),并分别给它们添加CFileView类上的命令响应,编辑:
void CFileView::OnFileWrite() { CFile file("6.txt",CFile::modeCreate|CFile::modeWrite);//定义一个CFile对象 file.Write("http://www.du.com",strlen("http://www.du.com"));//写入文件} void CFileView::OnFileRead() { CFile file("6.txt",CFile::modeRead);//以读模式创建一个文件 char *pBuf; DWORD dwFileLen; dwFileLen=file.GetLength();//获取文件长度 pBuf=new char[dwFileLen+1]; pBuf[dwFileLen]=0;//将pBuf中文件最后一字节的下一个字节置0 file.Read(pBuf,dwFileLen); file.Close(); MessageBox(pBuf); }2.添加打开和另存为文件对话框
void CFileView::OnFileWrite() { CFileDialog fileDlg(FALSE); //Set to TRUE to construct a File Open dialog box or FALSE to construct a File Save As dialog box fileDlg.m_ofn.lpstrTitle="文件保存对话框"; fileDlg.m_ofn.lpstrFilter="Text Files(*.txt)\0*.txt\0All Files(*.*)\0*.*\0\0";//设置过滤器,\0表示字符串的结尾,过滤器的结尾要以\0\0结尾 fileDlg.m_ofn.lpstrDefExt="txt";//设置默认的扩展名 if(fileDlg.DoModal()) { CFile file(fileDlg.GetFileName(),CFile::modeCreate|CFile::modeWrite); file.Write("http://www.baidu.com",strlen("http://www.baidu.com"));//写入文件 file.Close(); } } void CFileView::OnFileRead() { CFileDialog fileDlg(TRUE); //Set to TRUE to construct a File Open dialog box or FALSE to construct a File Save As dialog box fileDlg.m_ofn.lpstrTitle="文件打开对话框"; fileDlg.m_ofn.lpstrFilter="Text Files(*.txt)\0*.txt\0All Files(*.*)\0*.*\0\0";//设置过滤器,\0表示字符串的结尾,过滤器的结尾要以\0\0结尾 if(IDOK==fileDlg.DoModal()) { CFile file(fileDlg.GetFileName(),CFile::modeRead); char *pBuf; DWORD dwFileLen; dwFileLen=file.GetLength();//获取文件长度 pBuf=new char[dwFileLen+1]; pBuf[dwFileLen]=0;//将pBuf中文件最后一字节的下一个字节置0 file.Read(pBuf,dwFileLen); file.Close(); MessageBox(pBuf); } }
3.将初始化信息写到ini文件中
在CFileApp::InitInstance()添加: SetRegistryKey(_T("Local AppWizard-Generated Applications")); WriteProfileString("http://www.baidu.com","admin","luowei");//写入win.ini当中 LoadStdProfileSettings(); // Load standard INI file options (including MRU)9.读出ini文件中的信息
在CFileApp::InitInstance()编辑:SetRegistryKey(_T("Local AppWizard-Generated Applications")); //::WriteProfileString("http://www.baidu.com","admin","luowei");//写入win.ini当中 CString str; ::GetProfileString("http://www.baidu.com","admin","win_ini",str.GetBuffer(100),100); AfxMessageBox(str); LoadStdProfileSettings(); // Load standard INI file options (including MRU)