简单文件管理系统方案
- 格式:doc
- 大小:403.00 KB
- 文档页数:31
目录一、题目和要求 (2)二、相关原理分析和总的设计思想 (2)三、数据结构和流程图 (4)四、源程序 (6)五、运行结果 (18)六、自我评析与总结 (24)一、题目和要求(1) 题目:简单文件管理系统的设计及实现(2) 要求:根据文件系统的相关原理,设计并用C或C++编程实现一个类似Windows系统中“我的电脑”功能的文件管理系统,该文件系统可以对系统中所有文件进行管理,同时具有创建新文件、删除文件、复制文件、创建文件夹等功能。
二、相关原理分析和总的设计思想基于MFC AppWizard框架的程序定制一个菜单,有添加四个子菜单,创建,复制,删除,退出,在前三个子菜单中添加四个菜单项,文件夹,TXT,WORD,EXCEL。
每个菜单项对应着一种功能。
且复制选择路径都是基于对话框,操作方便,简洁明了。
○1创建文件夹;要创建文件夹,首先要选择文件夹创建的位置,可以用到浏览文件夹的函数SHBrowseForFolder和两个结构BROWSEINFO和ITEMIDLIST,要想得到文件夹路径可以用SHGetPathFromIDList,当然程序要想拥有建立文件夹的功能,应该设置BROWSEINFO对象的ulFlags的参数有BIF_NEWDIALOGSTYLE ;○2创建文件;不管是创建txt文件,word文件,excel文件原理都一样。
可以写一个build函数,提供几个参数:标题title, 路径filter,扩展名defExt。
这样创建文件时,可以根据标题,路径,扩展名的不同调用build函数,达到不同功能的目的在build函数体中使用CFileDialog定义一个对象来创建文件。
○3复制文件夹;第一步:复制文件夹可以在一个对话框中完成,这样必然需要添加一个类CCopyDlg。
第二步:在该对话框上设置两个按钮,一个按钮来选择源文件夹,保存源文件路径;一个按钮来选择目标文件夹,保存目标文件路径。
选择路径的方法可以与步骤○1的方法相同。
第三步:重写确定消息应用程序来实现从一个目录复制到另一个目录的功能(copyFiles)。
下面是copyFiles函数的实现原理:首先打开指定的文件夹进行搜索,再利用一个while循环,从当前目录搜索文件,判断搜索到的是不是"."和".."目录,如果是文件夹的话,进行递归;如果是文件,进行复制。
○4复制文件;复制文件跟复制文件夹一样也需要创建一个对话框,添加一个类。
同理也在对话框上添加两个按钮,分别接收源路径,和目标路径。
不过接收的方法需要通过CFileDialog选择对话框,而不能再和○1一样啦。
复制文件,vc中有已有的函数CopyFile。
参数是两个复制的路径。
○5删除文件夹在删除文件夹之前,首先要删除文件夹下的所有文件,再删除文件夹。
该功能的实现也是利用递归,先判断文件夹下是否有文件,若有,则删除,没有则删除文件夹,返回。
○6删除文件定义一个类CMyFileDialog继承CFileDialog而来,重写OnInitDialog函数来设置对话框中按钮的文本。
创建一个CMyFileDialog对象,在删除文件对话框中,选择想要删除的文件,调用DeleteFile函数进行文件的删除。
○7退出程序设置一个退出子菜单,发送一个WM_CLOSE消息,关闭程序退出。
三、数据结构和流程图该程序没有使用到复杂的数据结构,是基于MFC AppWizard应用程序。
主流程图:为使流程图简单些,将创建,复制,删除放一起,用“|”字符连接起来,代表“或”的意选择文件夹路径的流程图:四、源程序(1)定制一个菜单,添加5个子菜单,并分别设置它们的Popup,包括:创建(true)、复制(true)、删除(true)、帮助、退出(false)。
在子菜单中添加它们的菜单项。
如下所示:创建:文件夹,TXT,WORD,EXCEL复制:文件夹,TXT,WORD,EXCEL删除:文件夹,TXT,WORD,EXCEL帮助:关于DMS(&A)...退出(2)创建文件夹void CMainFrame::OnBuildFolder(){//选择新建文件夹的路径UpdateData(TRUE);char szDir[MAX_PATH];BROWSEINFO bi;ITEMIDLIST *pidl;bi.hwndOwner = this->m_hWnd;bi.pidlRoot = NULL;bi.pszDisplayName = LPWSTR(szDir);bi.lpszTitle = TEXT("新建文件夹");bi.ulFlags = BIF_EDITBOX | BIF_VALIDATE | BIF_NEWDIALOGSTYLE ;bi.lpfn = NULL;bi.lParam = 0;bi.iImage = 0;pidl = SHBrowseForFolder(&bi);if(pidl == NULL)return;if(!SHGetPathFromIDList(LPCITEMIDLIST(pidl), LPWSTR(szDir))) return;elsem_strPath = szDir;UpdateData(FALSE);}(3)创建文件的函数void CMainFrame::build(CString title, CString filter, CString defExt) {CFileDialog fileDlg(FALSE);fileDlg.m_ofn.lpstrTitle=title;fileDlg.m_ofn.lpstrFilter=filter;fileDlg.m_ofn.lpstrDefExt=defExt;if(IDOK==fileDlg.DoModal()){ //创建一个文档CFile file(fileDlg.GetFileName(),CFile::modeCreate);file.Close();}}创建txt文件:void CMainFrame::OnBuildTxt(){//创建一个Txt文档build(TEXT("新建Txt文档"),TEXT("TextFiles(*.txt)\0*.txt\0"),TEXT("txt"));}创建word文档:void CMainFrame::OnBuildWord(){//创建一个Word文档build(TEXT("新建Word文档"),TEXT("Text Files(*.doc)\0*.doc\0"),TEXT("doc"));}创建excel工作表:void CMainFrame::OnBuildExcel(){//创建一个Excel工作表build(TEXT("新建Excel工作表"),TEXT("Text Files(*.xls)\0*.xls\0"),TEXT("xls"));}创建txt、word、excel都是调用build函数。
(4)复制文件夹添加一个类:CCopyDlg;在对话框上添加两个按钮,“选择源文件夹”,“选择目标文件夹”;选择路径的函数:CString CCopyDlg::selectPath(CString path){//选择路径UpdateData(TRUE);char szDir[MAX_PATH];CString str;BROWSEINFO bi;ITEMIDLIST *pidl;bi.hwndOwner = this->m_hWnd;bi.pidlRoot = NULL;bi.pszDisplayName = LPTSTR (szDir);bi.lpszTitle = path;bi.ulFlags = BIF_EDITBOX | BIF_VALIDATE;bi.lpfn = NULL;bi.lParam = 0;bi.iImage = 0;pidl = SHBrowseForFolder(&bi);if(pidl == NULL)return CString();if(!SHGetPathFromIDList(pidl, LPTSTR (szDir)))return CString();elsestr = szDir;UpdateData(FALSE);return str;}分别对这两个按钮进行响应:void CCopyDlg::OnBnClickedButton1(){//获得源文件夹的路径m_strBgnPath=selectPath(TEXT("选择源文件夹")); }void CCopyDlg::OnBnClickedButton2(){//获得目标文件夹的路径m_strEndPath=selectPath(TEXT("选择目标文件夹")); }再添加一个复制函数:BOOL copyFiles(CString strSrcPath, CString strDstPath){ // 创建目标文件夹CreateDirectory(strDstPath,NULL);CFileFind finder;// 打开指定的文件夹进行搜索BOOL bWorking = finder.FindFile(strSrcPath + TEXT("\\*.*"));while(bWorking){// 从当前目录搜索文件bWorking = finder.FindNextFile();CString strFileName = finder.GetFileName();CString strSrc = strSrcPath + TEXT("\\") + strFileName;CString strDst = strDstPath + TEXT("\\") + strFileName;// 判断搜索到的是不是"."和".."目录if(!finder.IsDots()){// 判断搜索到的目录是否是文件夹if(finder.IsDirectory()){// 如果是文件夹的话,进行递归if(!copyFiles(strSrc, strDst))return false;}else{// 如果是文件,进行复制if(!CopyFile(strSrc, strDst, FALSE))return false;}}}return true;}对确定按钮的消息响应函数重写:void CCopyDlg::OnBnClickedOk(){copyFiles(m_strBgnPath,m_strEndPath);OnOK();}最后对菜单项:复制文件夹的响应:void CMainFrame::OnCopyFolder(){//弹出一个复制文件夹的对话框CCopyDlg dlg;dlg.DoModal();}(5)复制txt文件添加一个类:CTxtDlg;先对两个按钮,"选择源Txt文件""选择目的Txt文件"进行响应:void CTxtDlg::OnBnClickedButton1(){CFileDialog dlg(1,NULL,NULL,NULL,TEXT("Text files(*.txt)|*.txt"));dlg.m_ofn.lpstrTitle=TEXT("选择源Txt文件");if(dlg.DoModal()==IDOK){m_strBgnPath = dlg.GetPathName();}}void CTxtDlg::OnBnClickedButton2(){CFileDialog fileDlg(FALSE);fileDlg.m_ofn.lpstrTitle=TEXT("选择目的Txt文件");fileDlg.m_ofn.lpstrFilter=TEXT("Text Files(*.txt)\0*.txt\0");fileDlg.m_ofn.lpstrDefExt=TEXT("txt");if(IDOK==fileDlg.DoModal()){m_strEndPath=fileDlg.GetFileName();}}再对“确定”按钮进行响应:void CTxtDlg::OnBnClickedOk(){BOOL tempFile = CopyFile(m_strBgnPath,m_strEndPath,FALSE);int itemp = GetLastError();if(!tempFile){MessageBox( TEXT("文件复制失败") );}else{MessageBox( TEXT("文件复制成功") );}OnOK();}最后对菜单项:复制txt文件的响应:void CMainFrame::OnCopyTxt(){ //弹出一个复制Txt文件的对话框CTxtDlg dlg;dlg.DoModal();}(6)复制word文档添加一个类:CWordDlg;对两个按钮,"选择源Word文档""选择目的Word文档"进行响应:void CWordDlg::OnBnClickedButton1(){CFileDialog dlg(1,NULL,NULL,NULL,TEXT("Text files(*.doc)|*.doc"));dlg.m_ofn.lpstrTitle=TEXT("选择源Word文档");if(dlg.DoModal()==IDOK){m_strBgnPath = dlg.GetPathName();}}void CWordDlg::OnBnClickedButton2(){CFileDialog fileDlg(FALSE);fileDlg.m_ofn.lpstrTitle=TEXT("选择目的Word文档");fileDlg.m_ofn.lpstrFilter=TEXT("Text Files(*.doc)\0*.doc\0");fileDlg.m_ofn.lpstrDefExt=TEXT("doc");if(IDOK==fileDlg.DoModal()){m_strEndPath=fileDlg.GetFileName();}}再对“确定”按钮进行响应:void CWordDlg::OnBnClickedOk(){BOOL tempFile = CopyFile(m_strBgnPath,m_strEndPath,FALSE);int itemp = GetLastError();if(!tempFile){MessageBox( TEXT("文件复制失败") );}else{MessageBox( TEXT("文件复制成功") );}OnOK();}最后对菜单项:复制word文档的响应:void CMainFrame::OnCopyWord(){//弹出一个复制Word文件的对话框CWordDlg dlg;dlg.DoModal();}(7)复制excel工作表添加一个类:CExcelDlg;对两个按钮进行响应:void CExcelDlg::OnBnClickedButton3(){CFileDialog dlg(1,NULL,NULL,NULL,TEXT("Text files(*.xls)|*.xls"));dlg.m_ofn.lpstrTitle=TEXT("选择源Excel工作表");if(dlg.DoModal()==IDOK){m_strBgnPath = dlg.GetPathName();}}void CExcelDlg::OnBnClickedButton2(){CFileDialog fileDlg(FALSE);fileDlg.m_ofn.lpstrTitle=TEXT("选择目的Excel工作表)");fileDlg.m_ofn.lpstrFilter=TEXT("Text Files(*.xls)\0*.xls\0");fileDlg.m_ofn.lpstrDefExt=TEXT("xls");if(IDOK==fileDlg.DoModal()){m_strEndPath=fileDlg.GetFileName();}}再对确定按钮进行响应:void CExcelDlg::OnBnClickedOk(){BOOL tempFile = CopyFile(m_strBgnPath,m_strEndPath,FALSE);int itemp = GetLastError();if(!tempFile){MessageBox( TEXT("文件复制失败") );}else{MessageBox( TEXT("文件复制成功") );}OnOK();}最后对菜单项:复制excel工作表的响应:void CMainFrame::OnCopyExcel(){//弹出一个复制Excel文件的对话框CExcelDlg dlg;dlg.DoModal();}(8)删除文件夹的消息处理程序//删除非空目录function如下:BOOL DeleteDirectory(char *DirName){CFileFind tempFind;char tempFileFind[200];sprintf_s(tempFileFind,"%s\\*.*",DirName);BOOL IsFinded=(BOOL)tempFind.FindFile(LPCTSTR(tempFileFind));while(IsFinded){IsFinded=(BOOL)tempFind.FindNextFile();if(!tempFind.IsDots()){char foundFileName[200];strcpy_s(foundFileName,(char*)tempFind.GetFileName().GetBuffer(200));if(tempFind.IsDirectory()){char tempDir[200];sprintf_s(tempDir,"%s\\%s",DirName,foundFileName);DeleteDirectory(tempDir);}else{char tempFileName[200];sprintf_s(tempFileName,"%s\\%s",DirName,foundFileName);DeleteFileA(tempFileName);}}}tempFind.Close();if(!RemoveDirectoryA(DirName)){MessageBoxA(0,"删除目录失败!","警告信息",MB_OK);return FALSE;}return TRUE;}//删除文件夹void CMainFrame::OnDeleteFolder(){//选择要删除文件夹的路径UpdateData(TRUE);char szDir[MAX_PATH];BROWSEINFO bi;ITEMIDLIST *pidl;bi.hwndOwner = this->m_hWnd;bi.pidlRoot = NULL;bi.pszDisplayName = LPWSTR(szDir);bi.lpszTitle = TEXT("删除文件夹");bi.ulFlags = BIF_EDITBOX | BIF_VALIDATE;bi.lpfn = NULL;bi.lParam = 0;bi.iImage = 0;pidl = SHBrowseForFolder(&bi);if(pidl == NULL)return;if(!SHGetPathFromIDList(pidl, LPWSTR(szDir)))return;elsestrcpy_s(path , szDir);UpdateData(FALSE);DeleteDirectory(path);MessageBox(TEXT("删除文件夹成功"));}(9)增加一个CMyFileDialog类它是继承CFileDialog类而来,重写它的OnInitDialog函数:BOOL CMyFileDialog::OnInitDialog(void){//设置对话框上按钮的文本SetControlText(IDOK,"删除");return 0;}(10)删除txt文件的消息处理程序void CMainFrame::OnDeleteTxt(){CMyFileDialog dlg(1,NULL,NULL,NULL,TEXT("Text files(*.txt)|*.txt"));dlg.m_ofn.lpstrTitle=TEXT("选择要删除的Txt文件");if(dlg.DoModal()==IDOK){m_strTxtPath = dlg.GetPathName();}DeleteFile(m_strTxtPath);}(11)删除word文档的消息处理程序void CMainFrame::OnDeleteWord(){CMyFileDialog dlg(1,NULL,NULL,NULL,TEXT("Text files(*.doc)|*.doc"));dlg.m_ofn.lpstrTitle=TEXT("选择要删除的Word文档");if(dlg.DoModal()==IDOK){m_strTxtPath = dlg.GetPathName();}DeleteFile(m_strTxtPath);}(12)删除excel工作表的消息处理程序void CMainFrame::OnDeleteExcel(){CMyFileDialog dlg(1,NULL,NULL,NULL,TEXT("Text files(*.xls)|*.xls"));dlg.m_ofn.lpstrTitle=TEXT("选择要删除的Excel工作表");if(dlg.DoModal()==IDOK){m_strTxtPath = dlg.GetPathName();}DeleteFile(m_strTxtPath);}(13)退出的消息处理程序void CMainFrame::OnExit(){//发送一个退出程序的消息SendMessage(WM_CLOSE);}(14)修改窗口的标题在PreCreateWindow函数体中添加如下代码:// CREATESTRUCT cs 来修改窗口类或样式cs.style &=~FWS_ADDTOTITLE;cs.lpszName=TEXT("简单文件管理系统");(15)隐藏工具栏将以前的工具栏隐藏,在OnCreate函数体中添加如下代码:m_wndToolBar.ShowWindow(SW_HIDE);五、运行结果程序的主界面:窗口的标题“简单文件管理系统”它有三个弹出式子菜单:“创建”“复制”“删除”,它们都有四个菜单项:文件夹,TXT,WORD,EXCEL。