简单文件管理系统.docx
- 文档编号:11488058
- 上传时间:2023-03-01
- 格式:DOCX
- 页数:28
- 大小:272.19KB
简单文件管理系统.docx
《简单文件管理系统.docx》由会员分享,可在线阅读,更多相关《简单文件管理系统.docx(28页珍藏版)》请在冰豆网上搜索。
简单文件管理系统
目录
一、题目和要求2
二、相关原理分析和总的设计思想2
三、数据结构和流程图4
四、源程序6
五、运行结果18
六、自我评析与总结24
一、题目和要求
(1)题目:
简单文件管理系统的设计及实现
(2)要求:
根据文件系统的相关原理,设计并用C或C++编程实现一个类似Windows系统中“我的电脑”功能的文件管理系统,该文件系统可以对系统中所有文件进行管理,同时具有创建新文件、删除文件、复制文件、创建文件夹等功能。
二、相关原理分析和总的设计思想
基于MFCAppWizard框架的程序
定制一个菜单,有添加四个子菜单,创建,复制,删除,退出,在前三个子菜单中添加四个菜单项,文件夹,TXT,WORD,EXCEL。
每个菜单项对应着一种功能。
且复制选择路径都是基于对话框,操作方便,简洁明了。
创建文件夹;
要创建文件夹,首先要选择文件夹创建的位置,可以用到浏览文件夹的函数SHBrowseForFolder和两个结构BROWSEINFO和ITEMIDLIST,要想得到文件夹路径可以用SHGetPathFromIDList,当然程序要想拥有建立文件夹的功能,应该设置BROWSEINFO对象的ulFlags的参数有BIF_NEWDIALOGSTYLE;
创建文件;
不管是创建txt文件,word文件,excel文件原理都一样。
可以写一个build函数,提供几个参数:
标题title,路径filter,扩展名defExt。
这样创建文件时,可以根据标题,路径,扩展名的不同调用build函数,达到不同功能的目的
在build函数体中使用CFileDialog定义一个对象来创建文件。
复制文件夹;
第一步:
复制文件夹可以在一个对话框中完成,这样必然需要添加一个类CCopyDlg。
第二步:
在该对话框上设置两个按钮,一个按钮来选择源文件夹,保存源文件路径;一个按钮来选择目标文件夹,保存目标文件路径。
选择路径的方法可以与步骤
的方法相同。
第三步:
重写确定消息应用程序来实现从一个目录复制到另一个目录的功能(copyFiles)。
下面是copyFiles函数的实现原理:
首先打开指定的文件夹进行搜索,再利用一个while循环,从当前目录搜索文件,判断搜索到的是不是"."和".."目录,如果是文件夹的话,进行递归;如果是文件,进行复制。
复制文件;
复制文件跟复制文件夹一样也需要创建一个对话框,添加一个类。
同理也在对话框上添加两个按钮,分别接收源路径,和目标路径。
不过接收的方法需要通过CFileDialog选择对话框,而不能再和
一样啦。
复制文件,vc中有已有的函数CopyFile。
参数是两个复制的路径。
删除文件夹
在删除文件夹之前,首先要删除文件夹下的所有文件,再删除文件夹。
该功能的实现也是利用递归,先判断文件夹下是否有文件,若有,则删除,没有则删除文件夹,返回。
删除文件
定义一个类CMyFileDialog继承CFileDialog而来,重写OnInitDialog函数来设置对话框中按钮的文本。
创建一个CMyFileDialog对象,在删除文件对话框中,选择想要删除的文件,调用DeleteFile函数进行文件的删除。
退出程序
设置一个退出子菜单,发送一个WM_CLOSE消息,关闭程序退出。
三、数据结构和流程图
该程序没有使用到复杂的数据结构,是基于MFCAppWizard应用程序。
主流程图:
为使流程图简单些,将创建,复制,删除放一起,用“|”字符连接起来,代表“或”的意
选择文件夹路径的流程图:
四、源程序
(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;
else
m_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();
else
str=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.GetFileName();
}
}
再对“确定”按钮进行响应:
voidCTxtDlg:
:
OnBnClickedOk()
{
BOOLtempFile=CopyFile(m_strBgnPath,m_strEndPath,FALSE);
intitemp=GetLastError();
if(!
tempFile)
{
MessageBox(TEXT("文件复制失败"));
}
else
{
MessageBox(TEXT("文件复制成功"));
}
OnOK();
}
最后对菜单项:
复制txt文件的响应:
voidCMainFrame:
:
OnCopyTxt()
{//弹出一个复制Txt文件的对话框
CTxtDlgdlg;
dlg.DoModal();
}
(6)复制word文档
添加一个类:
CWordDlg;
对两个按钮,"选择源Word文档""选择目的Word文档"进行响应:
voidCWordDlg:
:
OnBnClickedButton1()
{
CFileDialogdlg(1,NULL,NULL,NULL,TEXT("Textfiles(*.doc)|*.doc"));
dlg.m_ofn.lpstrTitle=TEXT("选择源Word文档");
if(dlg.DoModal()==IDOK)
{
m_strBgnPath=dlg.GetPathName();
}
}
voidCWordDlg:
:
OnBnClickedButton2()
{
CFileDialogfileDlg(FALSE);
fileDlg.m_ofn.lpstrTitle=TEXT("选择目的Word文档");
fileDlg.m_ofn.lpstrFilter=TEXT("TextFiles(*.doc)\0*.doc\0");
fileDlg.m_ofn.lpstrDefExt=TEXT("doc");
if(IDOK==fileDlg.DoModal())
{
m_strEndPath=fileDlg.GetFileName();
}
}
再对“确定”按钮进行响应:
voidCWordDlg:
:
OnBnClickedOk()
{
BOOLtempFile=CopyFile(m_strBgnPath,m_strEndPath,FALSE);
intitemp=GetLastError();
if(!
tempFile)
{
MessageBox(TEXT("文件复制失败"));
}
else
{
MessageBox(TEXT("文件复制成功"));
}
OnOK();
}
最后对菜单项:
复制word文档的响应:
voidCMainFrame:
:
OnCopyWord()
{
//弹出一个复制Word文件的对话框
CWordDlgdlg;
dlg.DoModal();
}
(7)复制excel工作表
添加一个类:
CExcelDlg;
对两个按钮进行响应:
voidCExcelDlg:
:
OnBnClickedButton3()
{
CFileDialogdlg(1,NULL,NULL,NULL,TEXT("Textfiles(*.xls)|*.xls"));
dlg.m_ofn.lpstrTitle=TEXT("选择源Excel工作表");
if(dlg.DoModal()==IDOK)
{
m_strBgnPath=dlg.GetPathName();
}
}
voidCExcelDlg:
:
OnBnClickedButton2()
{
CFileDialogfileDlg(FALSE);
fileDlg.m_ofn.lpstrTitle=TEXT("选择目的Excel工作表)");
fileDlg.m_ofn.lpstrFilter=TEXT("TextFiles(*.xls)\0*.xls\0");
fileDlg.m_ofn.lpstrDefExt=TEXT("xls");
if(IDOK==fileDlg.DoModal())
{
m_strEndPath=fileDlg.GetFileName();
}
}
再对确定按钮进行响应:
voidCExcelDlg:
:
OnBnClickedOk()
{
BOOLtempFile=CopyFile(m_strBgnPath,m_strEndPath,FALSE);
intitemp=GetLastError();
if(!
tempFile)
{
MessageBox(TEXT("文件复制失败"));
}
else
{
MessageBox(TEXT("文件复制成功"));
}
OnOK();
}
最后对菜单项:
复制excel工作表的响应:
voidCMainFrame:
:
OnCopyExcel()
{
//弹出一个复制Excel文件的对话框
CExcelDlgdlg;
dlg.DoModal();
}
(8)删除文件夹的消息处理程序
//删除非空目录function如下:
BOOLDeleteDirectory(char*DirName)
{
CFileFindtempFind;
chartempFileFind[200];
sprintf_s(tempFileFind,"%s\\*.*",DirName);
BOOLIsFinded=(BOOL)tempFind.FindFile(LPCTSTR(tempFileFind));
while(IsFinded)
{
IsFinded=(BOOL)tempFind.FindNextFile();
if(!
tempFind.IsDots())
{
charfoundFileName[200];
strcpy_s(foundFileName,(char*)tempFind.GetFileName().GetBuffer(200));
if(tempFind.IsDirectory())
{
chartempDir[200];
sprintf_s(tempDir,"%s\\%s",DirName,foundFileName);
DeleteDirectory(tempDir);
}
else
{
chartempFileName[200];
sprintf_s(tempFileName,"%s\\%s",DirName,foundFileName);
DeleteFileA(tempFileName);
}
}
}
tempFind.Close();
if(!
RemoveDirectoryA(DirName))
{
MessageBoxA(0,"删除目录失败!
","警告信息",MB_OK);
returnFALSE;
}
returnTRUE;
}
//删除文件夹
voidCMainFrame:
:
OnDeleteFolder()
{
//选择要删除文件夹的路径
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;
bi.lpfn=NULL;
bi.lParam=0;
bi.iImage=0;
pidl=SHBrowseForFolder(&bi);
if(pidl==NULL)
return;
if(!
SHGetPathFromIDList(pidl,LPWSTR(szDir)))
return;
else
strcpy_s(path,szDir);
UpdateData(FALSE);
DeleteDirectory(path);
MessageBox(TEXT("删除文件夹成功"));
}
(9)增加一个CMyFileDialog类
它是继承CFileDialog类而来,重写它的OnInitDialog函数:
BOOLCMyFileDialog:
:
OnInitDialog(void)
{
//设置对话框上按钮的文本
SetControlText(IDOK,"删除");
return0;
}
(10)删除txt文件的消息处理程序
voidCMainFrame:
:
OnDeleteTxt()
{
CMyFileDialogdlg(1,NULL,NULL,NULL,TEXT("Textfiles(*.txt)|*.txt"));
dlg.m_ofn.lpstrTitle=TEXT("选择要删除的Txt文件");
if(dlg.DoModal()==IDOK)
{
m_strTxtPath=dlg.GetPathName();
}
DeleteFile(m_strTxtPath);
}
(11)删除word文档的消息处理程序
voidCMainFrame:
:
OnDeleteWord()
{
CMyFileDialogdlg(1,NULL,NULL,NULL,TEXT("Textfiles(*.doc)|*.doc"));
dlg.m_ofn.lpstrTitle=TEXT("选择要删除的Word文档");
if(dlg.DoModal()==IDOK)
{
m_strTxtPath=dlg.GetPathName();
}
DeleteFile(m_strTxtPath);
}
(12)删除excel工
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 简单 文件 管理 系统