资源描述
目录
一、题目和要求 2
二、相关原理分析和总的设计思想 2
三、数据结构和流程图 4
四、源程序 6
五、运行结果 18
六、自我评析与总结 24
一、题目和要求
(1) 题目:简单文件管理系统的设计及实现
(2) 要求:根据文件系统的相关原理,设计并用C或C++编程实现一个类似Windows系统中“我的电脑”功能的文件管理系统,该文件系统可以对系统中所有文件进行管理,同时具有创建新文件、删除文件、复制文件、创建文件夹等功能。
二、相关原理分析和总的设计思想
基于MFC AppWizard框架的程序
定制一个菜单,有添加四个子菜单,创建,复制,删除,退出,在前三个子菜单中添加四个菜单项,文件夹,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消息,关闭程序退出。
三、数据结构和流程图
该程序没有使用到复杂的数据结构,是基于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;
else
m_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();
else
str = 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;
else
strcpy_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。
最后一个子菜单:“退出” ,是一个非弹出式的子菜单,有退出程序的消息响应函数。方便用户人性化退出。单击:退出。便可退出程序
(1)创建文件夹
单击“创建”->“文件夹”
将弹出如下所示的对话框:
选择好路径,单击“新建文件夹”就可以在其目录下创建一个新的文件夹。
(2)创建文件
不管是创建txt文件,word文件,还是excel文件,原理都是一样的,操作步骤也是相近的,下面以txt格式为例,演示一下。
首先单击子菜单“创建”,选择“TXT”菜单项。
将弹出如下所示的对话框,
你可以在对话框中选择路径,在文件名的文本编辑框中输入你要保存的文件名。
因为要创建的是txt文件,所以保存类型默认的后缀名为“.txt”。
(3)复制文件夹
操作步骤:“复制”->“文件夹”
将弹出如下所示的对话框:
单击按钮“选择源文件夹”,是要你选择要复制哪个文件夹,将弹出选择框,如下所示:
单击按钮“选择目标文件夹”,是要你选择要复制到哪个文件夹下,将弹出选择框,如下所示:
最后单击对话框中的“确定”按钮,这样就把指定的文件夹复制到了指定的目录下。
(4)复制txt文件,word文件,excel文件都跟复制文件夹的类似,这就不再重复操作,演示。
(5)删除文件夹
单击“删除”->“文件夹”
选择好要删除的文件夹,单击确定就可以删除文件夹了
(6)删除文件
Txt,word,excel等文件删除的方式都一样,下面以删除word文件为例,演示一下。
“删除”->“WORD”,将弹出如下所示的删除文件对话框,选择要删除的word文档,单击删除按钮,就可以成功删除啦。
(程序操作演示完毕)
六、自我评析与总结
(1)做得比较好的地方:
条理清晰。
我写这个程序有非常清晰的思路,根据文件管理系统的功能,有创建,复制,删除等。每种功能对应着一个子菜单。每个子菜单对应着一个消息处理程序。
用户操作方便
由于本程序的操作都是基于菜单或者对话框的,用户一目了解,能迅速掌握操作方法。
界面整洁美观
不管是选择对话框也好,直接点击菜单进行响应也好,整个界面都有比较美观,直接。
(2)有待提高:
自己学API函数一年,能力上还有些不足。
(3)收获:
复习了不少API函数,自己运用MFC AppWizard更熟练啦。
(4)自我打分:
我知道老师现在都很看重点名,我比较懒散,我上机没去。这对课设成绩肯定有影响。
现在老师越来越不看重能力,看重的是老实,尊纪。作为学生的我,我也是相当无奈啊,老师。机房没有vc2008,我无法在实验室写这个程序。
班上最多不会有超过5个人会自己写程序,这点老师也知道,我的整个课设,全是自己写的,没有抄一个字。
不管老师打什么,我都要给我自己打一个优秀!
物业安保培训方案
为规范保安工作,使保安工作系统化/规范化,最终使保安具备满足工作需要的知识和技能,特制定本教学教材大纲。
一、课程设置及内容全部课程分为专业理论知识和技能训练两大科目。
其中专业理论知识内容包括:保安理论知识、消防业务知识、职业道德、法律常识、保安礼仪、救护知识。作技能训练内容包括:岗位操作指引、勤务技能、消防技能、军事技能。
二.培训的及要求培训目的
1)保安人员培训应以保安理论知识、消防知识、法律常识教学为主,在教学过程中,应要求学员全面熟知保安理论知识及消防专业知识,在工作中的操作与运用,并基本掌握现场保护及处理知识2)职业道德课程的教学应根据不同的岗位元而予以不同的内容,使保安在各自不同的工作岗位上都能养成具有本职业特点的良好职业道德和行为规范)法律常识教学是理论课的主要内容之一,要求所有保安都应熟知国家有关法律、法规,成为懂法、知法、守法的公民,运用法律这一有力武器与违法犯罪分子作斗争。工作入口门卫守护,定点守卫及区域巡逻为主要内容,在日常管理和发生突发事件时能够运用所学的技能保护公司财产以及自身安全。
2、培训要求
1)保安理论培训
通过培训使保安熟知保安工作性质、地位、任务、及工作职责权限,同时全面掌握保安专业知识以及在具体工作中应注意的事项及一般情况处置的原则和方法。
2)消防知识及消防器材的使用
通过培训使保安熟知掌握消防工作的方针任务和意义,熟知各种防火的措施和消防器材设施的操作及使用方法,做到防患于未燃,保护公司财产和员工生命财产的安全。
3) 法律常识及职业道德教育
通过法律常识及职业道德教育,使保安树立法律意识和良好的职业道德观念,能够运用法律知识正确处理工作中发生的各种问题;增强保安人员爱岗敬业、无私奉献更好的为公司服务的精神。
4) 工作技能培训
26
展开阅读全文