文件操作(2):文件粉碎机
文件粉碎机原理:文件被删除之前,用随机字符对其进行写操作
(注:参考的教材使用的是BCB编译器,BCB不会,所以这里改成使用MFC)
一、
首先建立一个基于对话框的MFC工程,在对话框添加如图所示控件
二、
接下来添加 statusbar(状态栏)控件,使用 CStatusBarCtrl类,具体操作是在主对话框文件中添加,一个类型为CStatusBarCtrl的成员变量 m_StatusBar
CStatusBarCtrl m_StatusBar;
在初始化函数中对其进行初始化:
m_StatusBar.Create(WS_CHILD|WS_VISIBLE|SBT_OWNERDRAW, CRect(0,0,0,0), this, 0); int strPartDim[2]= { 400, -1}; //分割成左右两份,左边占400个像素 m_StatusBar.SetParts(2, strPartDim);
设置好之后,我们用CStatusBarCtrl::SetText()就可以在状态栏上显示文字了。
注意,VC6.0中,状态栏不能在资管控件中直接添加,而是需要使用程序来创建,因此,也只有在程序运行之后才能显示出来
三、
下面来添加对话框控件的响应。首先点击浏览要弹出打开文件对话框,点击文件夹的文件,令点击的文件名显示在左边的文本编辑框中。
1、首先为文本编辑框关联一个名为m_strPath 的成员变量。按下ctrl+w,选择编辑控件ID,添加成员变量,输入m_strPath
2、双击 浏览按钮,进入响应函数,在里面添加如下代码:
// TODO: Add your control notification handler code here UpdateData(TRUE); CFileDialog fileDlg(TRUE); fileDlg.m_ofn.lpstrTitle="打开文件"; fileDlg.m_ofn.lpstrFilter="All Files(*.*)\0*.*\0\0"; fileDlg.m_ofn.lpstrDefExt="*.txt"; if(IDOK==fileDlg.DoModal()) { CFile file(fileDlg.GetFileName(),CFile::modeRead); m_strPath=fileDlg.GetPathName(); //将文件名赋给m_strPath UpdateData(FALSE); //立即显示出来 }
四,主程序,双击开始粉碎,添加按钮响应。
添加如下代码:
if(m_strPath=="") { return; } if((MessageBox("文件一旦删除将无法恢复,您确定要继续执行操作吗?","提醒",MB_OKCANCEL|MB_ICONWARNING|MB_DEFBUTTON2))==IDCANCEL) { m_StatusBar.SetText(_T("您取消了操作"), 0, 0); //设置状态栏文本提示信息 return; } char buff[1024]={0}; HANDLE hFile=CreateFile(m_strPath,GENERIC_WRITE|GENERIC_READ,FILE_SHARE_WRITE,NULL,OPEN_EXISTING,NULL,NULL); DWORD dwLen=SetFilePointer(hFile,0,NULL,FILE_END); CString temp; temp.Format("文件大小%dbyte",dwLen); m_StatusBar.SetText(temp, 0, 0); for(int i=0;i<3;i++) { temp.Format("共进行%d遍擦除",i+1); m_StatusBar.SetText(temp, 0, 0); SetFilePointer(hFile,0,NULL,FILE_BEGIN); if(dwLen<=1024) { dwLen=WriteFile(hFile,buff,(dwLen<sizeof(buff))?dwLen:sizeof(buff),&dwLen,NULL); } } CloseHandle(hFile); if(!DeleteFile(m_strPath)) { m_StatusBar.SetText(_T("文件删除失败,但已无法恢复"), 0, 0); }
五、
添加取消按钮的响应,双击,写个OnOK();就行了
程序运行效果:
时间,时间,会给我答案
time will give me the answer