您好,欢迎访问三七文档
目录一、题目和要求.........................2二、相关原理分析和总的设计思想.........2三、数据结构和流程图...................4四、源程序.............................6五、运行结果..........................18六、自我评析与总结....................24一、题目和要求(1)题目:简单文件管理系统的设计及实现(2)要求:根据文件系统的相关原理,设计并用C或C++编程实现一个类似Windows系统中“我的电脑”功能的文件管理系统,该文件系统可以对系统中所有文件进行管理,同时具有创建新文件、删除文件、复制文件、创建文件夹等功能。二、相关原理分析和总的设计思想基于MFCAppWizard框架的程序定制一个菜单,有添加四个子菜单,创建,复制,删除,退出,在前三个子菜单中添加四个菜单项,文件夹,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消息,关闭程序退出。三、数据结构和流程图该程序没有使用到复杂的数据结构,是基于MFCAppWizard应用程序。主流程图:开始选择子菜单创建|复制|删除退出选择菜单项文件夹TXTWORDEXCEL消息处理程序消息处理程序消息处理程序消息处理程序结束为使流程图简单些,将创建,复制,删除放一起,用“|”字符连接起来,代表“或”的意选择文件夹路径的流程图:开始UpdateData(TRUE)初始化结构bipidl==NULL结束Y!SHGetPathFromIDListNYUpdateData(FALSE)m_strPath=szDirN四、源程序(1)定制一个菜单,添加5个子菜单,并分别设置它们的Popup,包括:创建(true)、复制(true)、删除(true)、帮助、退出(false)。在子菜单中添加它们的菜单项。如下所示:创建:文件夹,TXT,WORD,EXCEL复制:文件夹,TXT,WORD,EXCEL删除:文件夹,TXT,WORD,EXCEL帮助:关于DMS(&A)...退出(2)创建文件夹voidCMainFrame::OnBuildFolder(){//选择新建文件夹的路径UpdateData(TRUE);charszDir[MAX_PATH];BROWSEINFObi;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)创建文件的函数voidCMainFrame::build(CStringtitle,CStringfilter,CStringdefExt){CFileDialogfileDlg(FALSE);fileDlg.m_ofn.lpstrTitle=title;fileDlg.m_ofn.lpstrFilter=filter;fileDlg.m_ofn.lpstrDefExt=defExt;if(IDOK==fileDlg.DoModal()){//创建一个文档CFilefile(fileDlg.GetFileName(),CFile::modeCreate);file.Close();}}创建txt文件:voidCMainFrame::OnBuildTxt(){//创建一个Txt文档build(TEXT(新建Txt文档),TEXT(TextFiles(*.txt)\0*.txt\0),TEXT(txt));}创建word文档:voidCMainFrame::OnBuildWord(){//创建一个Word文档build(TEXT(新建Word文档),TEXT(TextFiles(*.doc)\0*.doc\0),TEXT(doc));}创建excel工作表:voidCMainFrame::OnBuildExcel(){//创建一个Excel工作表build(TEXT(新建Excel工作表),TEXT(TextFiles(*.xls)\0*.xls\0),TEXT(xls));}创建txt、word、excel都是调用build函数。(4)复制文件夹添加一个类:CCopyDlg;在对话框上添加两个按钮,“选择源文件夹”,“选择目标文件夹”;选择路径的函数:CStringCCopyDlg::selectPath(CStringpath){//选择路径UpdateData(TRUE);charszDir[MAX_PATH];CStringstr;BROWSEINFObi;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)returnCString();if(!SHGetPathFromIDList(pidl,LPTSTR(szDir)))returnCString();elsestr=szDir;UpdateData(FALSE);returnstr;}分别对这两个按钮进行响应:voidCCopyDlg::OnBnClickedButton1(){//获得源文件夹的路径m_strBgnPath=selectPath(TEXT(选择源文件夹));}voidCCopyDlg::OnBnClickedButton2(){//获得目标文件夹的路径m_strEndPath=selectPath(TEXT(选择目标文件夹));}再添加一个复制函数:BOOLcopyFiles(CStringstrSrcPath,CStringstrDstPath){//创建目标文件夹CreateDirectory(strDstPath,NULL);CFileFindfinder;//打开指定的文件夹进行搜索BOOLbWorking=finder.FindFile(strSrcPath+TEXT(\\*.*));while(bWorking){//从当前目录搜索文件bWorking=finder.FindNextFile();CStringstrFileName=finder.GetFileName();CStringstrSrc=strSrcPath+TEXT(\\)+strFileName;CStringstrDst=strDstPath+TEXT(\\)+strFileName;//判断搜索到的是不是.和..目录if(!finder.IsDots()){//判断搜索到的目录是否是文件夹if(finder.IsDirectory()){//如果是文件夹的话,进行递归if(!copyFiles(strSrc,strDst))returnfalse;}else{//如果是文件,进行复制if(!CopyFile(strSrc,strDst,FALSE))returnfalse;}}}returntrue;}对确定按钮的消息响应函数重写:voidCCopyDlg::OnBnClickedOk(){copyFiles(m_strBgnPath,m_strEndPath);OnOK();}最后对菜单项:复制文件夹的响应:voidCMainFrame::OnCopyFolder(){//弹出一个复制文件夹的对话框CCopyDlgdlg;dlg.DoModal();}(5)复制txt文件添加一个类:CTxtDlg;先对两个按钮,选择源Txt文件选择目的Txt文件进行响应:voidCTxtDlg::OnBnClickedButton1(){CFileDialogdlg(1,NULL,NULL,NULL,TEXT(Textfiles(*.txt)|*.txt));dlg.m_ofn.lpstrTitle=TEXT(选择源Txt文件);if(dlg.DoModal()==IDOK){m_strBgnPath=dlg.GetPathName();}}voidCTxtDlg::OnBnClickedButton2(){CFileDialogfileDlg(FALSE);fileDlg.m_ofn.lpstrTitle=TEXT(选择目的Txt文件);fileDlg.m_ofn.lpstrFilter=TEXT(TextFiles(*.txt)\0*.txt\0);fileDlg.m_ofn.lpstrDefExt=TEXT(txt);if(IDOK==fileDlg.DoModal()){m_strEndPath=fileDlg
本文标题:简单文件管理系统
链接地址:https://www.777doc.com/doc-5146887 .html