




已阅读5页,还剩17页未读, 继续免费阅读
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
面向对象程序设计与C+课程设计题目:文件管理系统院、 系: 计算机信息与技术学科专业: 计算机科学与技术学 号: 00000000 学生姓名: 徐飞 指导教师: 2012年12月21日目录一目的1二总体介绍2三详细介绍3四功能测试及运行效果7五设计体会及小结10六参考文献11七附录-源代码12中文摘要本课程设计将实现一个文件管理系统。这个文件管理系统能实现对文件增、删、查、改等基本的文件的操作。本程序一改普通的control console的菜单界面,继而改用类似DOS系统下的命令行界面。这样做的目的是为了提高用户使用程序的效率。 在课程设计中,采用了VC6.0。在程序设计中,采用了结构化与面向对象两种解决问题方法。结构化的思想主要应用在划分功能模块上,而面向对象的思想主要应用在把所有的属性和方法封装起来,以备各模块的调用,这样做的目的是为了让整个程序的结构清晰、体系完整,便于维护。西安工业大学北方信息工程学院一 目的此次课程设计的目的是用C+程序设计语言编写一个文件管理系统,这个文件管理系统需要实现一下几项目标:角度目标程序功能创建文件、删除文件、查看文件内容、将内容写入文件、复制并粘贴文件、进入某个目录下进行文件操作、重命名文件、创建目录、删除目录、显示当前文件夹下的文件及目录以及获得帮助。用户操作简单,更需要简洁。有助于提高工作效率。程序代码层次、结构清晰,便于扩展功能和维护。程序的整个操作流程类似DOS命令行界面,要求所有的操作均在某一目录下进行(我们把此目录叫做“操作目录”),提供进入到其它目录的命令以实现全磁盘的文件管理。- 19 -二 总体介绍C+提供的文件输入输出流的功能比较通用,所以在这个文件管理系统下,需要将C+中所提供的输入输出流的功能进行改造,隐藏掉一些不需要在这个文件管理系统中使用的功能,以适合这个文件管理系统的需要。我们先建一个BaseClass(基类),提供最基本的输入输出流对象,以及提供打开与关闭流的功能方便派生类的“具有层次性的”调用(可结合下图阅读)。同C+中的设计一样,我们用BaseClass派生出FileOperatorIn、FileOperatorOut两个类,这两个类的基本作用分别是从外部读入文件(二进制形式,这样不会因为格式化的读入而将原始数据破坏)和将需要写入的内容向文件输出(格式同读入)。BaseClass-flag:int+ofile:ofstream+ifile:ifstream+BaseClass(string &name)+BaseClass(bool a,string &name) +BaseClass()FileOperatorOut+WriteFile(string &content):void inlineFileOperatorIn-line:string+readfile():string inline有了FileOperatorIn和FileOperatorOut两个文件类后,我们可以结合各种C+或Windows给我们提供的文件操作函数来进行磁盘上的文件管理了。为了使程序的结构层次清晰,我们将各种操作封装到一个FunClass(操作类)中,方便main函数进行调用。整个架构图如下:三 详细介绍现在,我们依照总体介绍里的框架进行详细叙述。BaseClass的实现: BaseClass(string &name):flag(1)ofile.open(name.data(),ios_base:out|ios_base:binary);BaseClass(bool a,string &name):flag(2)ifile.open(name.data(),ios_base:in|ios_base:binary);BaseClass有两个重载构造函数,这样做的目的是为了区分是哪个派生类使用的,方便管理。而且所有的打开方式均为二进制形式,目的是不破坏源文件。置标志位目的是依据使用的构造函数来进行析构。BaseClass的两个派生类(FileOperatorIn和FileOperatorOut):他们的构造函数唯一的的目的就是初始化基类。string FileOperatorIn:readfile()getline(ifile,line,0);return line;FileOperatorOut:WriteFile(string &content)ofile.write(content.data(),content.length();两个派生类中的输入输出流都是用最基本的getline和write函数来实现的,因其比较简单,故不做过多解释(具体的细节请参考源代码)。下面具体介绍FunClass。FunClass+Command(string &CommandName):int inline+CreatFile(string &k):bool inline+OpenFile(string &k):bool inline+WriteInFile(string &k):void inline+CopyFile(string &SourceFile,string &NewFile):bool inline+ReName(string &k,string &NewName):void inline+Dir(string k):void+CreatDir(string &k):int inline+deletefile(string &k):bool inline+Cd(string k):bool inline+help():void inline+deldir(string &k):int inlineCommand函数是用来解释输入的指令供主函数中的switch判断之用。因其代码简单,故不解释。CreatFile函数是用来在操作目录下创建一个新文件,可以自定类型。关键语句:FileOperatorOut a(k);if(a.ofile)return true;return false;用传入的参数(string类的一个对象,用于存放需要创建的文件名)来构造一个FileOperatorOut的对象(上面已经介绍过FileOperatorOut类)。OpenFile函数是用来在操作目录下获取一个文件,并显示其中的信息(一般用于查看txt、log等文件)。关键语句:FileOperatorIn a(true,k);if(a.ifile)couta.readfile()endl;return true;else return false;用传入的参数(string类的一个对象,用于存放需要打开的文件名)来构造一个FileOperatorIn的对象如果构造成功,则读取其中的内容显示到屏幕,否则返回false。WriteInFile函数用来向操作目录下的某个文件写入信息。关键语句:string t;FileOperatorOut a(k);cout请输入需要写入的内容endl;getline(cin,t);a.WriteFile(t);先用k来构造一个FileOperatorOut的对象,用于先打开磁盘上相应的文件(如果磁盘上没有需要的文件则创建一个),然后用getline函数接受输入的内容,通过FileOperatorOut对象的WriteFile方法写入到相应的文件中去。CopyFile函数用于将操作目录下的某个文件复制并粘贴到任意目录下。第一个参数为操作目录下的文件名,第二个参数是需要复制到的目录,必须填入完整路径(不填默认为程序运行目录)。关键语句:out.ofilein.ifile.rdbuf();其中out和in分别为FileOperatorOut和FileOperatorIn类的对象,用in打开一个需要被复制的文件然后经过重定向加载到输出流对象中向目标磁盘输出,实现复制的功能。而且out和in对象对文件的打开方式均为二进制形式,所以不会破坏文件的源格式,继而保障复制的可靠性。ReName函数用于将操作目录下的文件进行重命名操作。关键语句:ifstream in(k.data();if(in)/判断打开是否成功in.close();if(!rename(k.data(),NewName.data()调用rename函数(windows提供,用于函数的重命名)进行重命名操作。在调用rename函数之前一定要先关闭打开的文件(即加上in.close()。Dir函数用于显示操作目录下的文件与目录。关键语句:k.insert(k.length(),*.*); _finddata_t file; long lf;if(lf = _findfirst(k.data(), &file)=-1l) cout文件没有找到!n; else coutn文件列表:n; while( _findnext( lf, &file ) = 0 ) ; if(file.attrib = _A_NORMAL)cout 普通文件 ; else if(file.attrib = _A_RDONLY)cout 只读文件 ; else if(file.attrib = _A_HIDDEN )cout 隐藏文件 ; else if(file.attrib = _A_SYSTEM )cout 系统文件 ; else if(file.attrib = _A_SUBDIR)cout 子目录 ; else cout 存档文件 ; coutendl; _findclose(lf);k.insert(k.length(),*.*)语句用于将k中存放的路径后面加上*.*通配符,便于_findfirst中查找,_findfirst返回第一个唯一的long型的供_findnext查找用的句柄,如果返回为-1l(l表示long型),表示一个文件也没有。如果找到了,用_findnext去找下一个文件,找到返回0,否则返回-1。他们的第二个参数均为struct _finddata_t *类型。CreatDir函数用于在操作目录下直接创建一个目录。关键语句:return _mkdir(k.data();这个语句非常简单,直接调用函数mkdir即可在操作目录下创建目录,括号里的参数存放操作目录路径及需要被创建的目录名。deletefile函数用于删除操作目录下的特定文件。函数参数存放的是文件名。关监语句:DeleteFileA(k.data();DeleteFileA接受的是char型字符(非宽字符型),用于删除特定目录下的文件。Cd函数用于指定一个操作目录,是扩展文件操作的关键函数。他接收路径,用_findfirst判断目录是否存在,存在则返回true,再在主函数中进行处理。关监语句: _finddata_t file;if(_findfirst(k.data(), &file)=-1l)return false; elsereturn true;Help函数是提供帮助信息的。函数很简单,故不做解释。deldir函数用于在操作目录下删除一个目录。关键语句:return _rmdir(k.data();这个语句非常简单,直接调用函数rmdir即可在操作目录下删除目录,括号里的参数存放操作目录路径及需要被删除的目录名。FunClass类里封装的操作已经介绍完毕,其中只列出了关键语句的分析,可对照着源代码进行查看。main函数介绍。int main()string i,command,opera;FunClass fun;i=_getcwd(NULL,0);i+=;while(1)couti;cincommand;switch(fun.Command(command)case 1:cinopera,cin.sync();fun.CreatFile(i+opera)?cout创建成功!endl:cout创建失败!opera,cin.sync();fun.OpenFile(i+opera)?cout打开成功!endl:cout打开失败!opera,cin.sync();fun.WriteInFile(i+opera);cout写入成功!opera;string temp;cintemp;cin.sync();fun.CopyFile(i+opera,temp)?cout粘贴成功!endl:cout粘贴失败!opera,cin.sync();if(fun.Cd(opera)i=opera,i+=;else(cout目录不存在!nopera;string NewName;cinNewName,cin.sync();fun.ReName(i+opera,i+NewName);break;case 7:cin.sync();fun.Dir(i);break;case 8:cinopera,cin.sync();fun.CreatDir(i+opera)?cout创建失败!endl:cout创建成功!opera,cin.sync();fun.deletefile(i+opera)?cout删除成功!endl:cout删除失败!opera,cin.sync();fun.deldir(i+opera)?cout删除失败!endl:cout删除成功!endl;break;default:cout不是有效的命令!可输入help寻求帮助。endl;break;return 0;在main函数中,为了实现“指令 参数1 参数2”这样的类似dos的指令格式,巧妙的利用了cin读取输入字符的特点遇到空格及读入完毕。这样我们就可以定义两个string类对象command和opera,其中command是用来存放指令的,opera是用来存放参数1的(如果还有参数2则在switch语句中临时申请),他们之间的读入就是利用了cin的特点,在读完之后,为了不影响后面的读入,需要用cin.sync()语句来清空缓冲区。opera接受的大多数是路径,也可以不输入路径,直接输入需要进行操作的文件名(默认为当前程序运行状态下的目录),为了保证在任意操作目录下都能使用,引入了string类的对象i,用来存放操作目录的路径。只需要在给FunClass中的操作传参时将参数写成(i+opera)的形式,这样一来,就可以实现对任意目录下的文件进行操作的目的,极大的扩展了FunClass中操作的功能。为了指定程序一开始时的操作目录,我们使用了_getcwd(NULL,0)函数,用来获取当前程序运行时所在的路径,我们用它来作为文件管理系统默认的操作目录。四 功能测试及运行效果功能测试1:进入任意一个操作目录。用到的指令:cd进入E盘下的111文件夹。功能测试2:显示操作目录下的所有文件及目录。用到的指令:dir.由图可见,111文件夹下什么都没有。功能测试3:在操作目录下新建一个文件夹。用到的指令:mkdir我们用前面的dir命令查看创建结果,却是有一个叫xufei的文件夹被创建。功能测试4:在操作目录下新建一个文件。用到的指令:new还是使用dir命令查看创建结果(下面用dir查看不在熬述),去我是创建了一个xufei.txt的文本文件。功能测试5:在操作目录下向一个文件写入内容。用到的指令:write我们可以查看里面的内容以确定内容是否被写入。这需要用到open指令,下面就来演示open指令。功能测试6:在操作目录下查看一个文件。用到的指令:open由图可见,内容确实被写入了xufei.txt中。功能测试7:在操作目录下将某一个文件重命名。用到的指令:rename功能测试8:在操作目录下将某一个文件复制并粘贴到其它目录下。用到的指令:copy由图可见,在我们重复使用以上几个指令后,查看到确实是复制成功了。功能测试9:在操作目录下将某一个文件删除。用到的指令:delete功能测试10:在操作目录下将某一个目录删除。用到的指令:rmdir功能测试11:查看帮助文档。用到的指令:help功能测试12:退出程序。用到的指令:exit五 设计体会及小结在这次的课程设计中,我发现大多数情况下我们在做一个项目时,并不是一开始就具备完成这项项目的所有知识。这就要求我们学会怎样去快速的学会做项目所需要的全部知识。遇到有些不会处理的,我会上网去查,查一些函数的用法,比如_finddata_t、_findfirst、_findnext、DeleteFileA等函数。以前我对这些函数是完全不知的,但现在我不仅掌握了他们的使用方法,更重要的是我学会了如何去学习,然后快速地应用到我所需要的项目当中。在做这个文件管理系统时,我把它当作了一个产品去做,所以每个细节考虑的虽不完全,但也周到。但这并不能说明什么,因为很多软件都是通过升级的方式来弥补自身的缺陷,我的文件管理系统也是如此。在使用之中发现问题后再去积极的修改问题,使得软件越来越完善。而且只有这样才是软件开发必经之路,因为没有什么事物一生下来就是完美的,都是在通过追求卓越的过程中完善自己,继而达到巅峰的。在这次的课程设计中我还领悟了一个重大的问题:在开发一个软件的过程中,把整个系统的框架准确的描述出来是非常重要的。因为我们后面的编码式样在整个系统框架的基础之上进行的,如果系统框架在搭建的时候出现了模块的冲突,那会影响整个软件开发的进度,最终就会引发软件危机。而这是我们所不希望看到的。所以,在软件开发之前,一定要详细的讨论整个系统的框架,确保合理的情况下再进行下一步工作,严格的把开发软件真正的当成一项工程来对待。在编码方面,我发现良好的代码风格是成功的一半。在编码的过程中需要时常进行修改,如果程序的可读性不强,代码量又庞大的话,那么对于编码人员来说是一件非常不幸的事情,因为他必须时常让他的大脑工作在“超频”状态,这样总有一天会“烧掉”的。所以养成良好的代码书写风格是非常重要的。总而言之,通过一次的课程设计,不仅对这门课程的知识掌握更加牢固了,还学到了关于以后从事计算机方面工作的一些方法论。最后,用一句话总结这次的课程设计收获多多!六 参考文献1郑莉,董渊,何江舟.C+语言程序设计(第4版)M.北京:清华大学出版社,2010.七 附录-源代码1. funlib.h文件(这是一个头文件,共三个文件)#includefileclass.h#include#include #includeclass FunClasspublic:inline int Command(string &CommandName)const;inline bool CreatFile(string &k)const;inline bool OpenFile(string &k)const;inline void WriteInFile(string &k)const;inline bool CopyFile(string &SourceFile,string &NewFile)const;inline void ReName(string &k,string &NewName)const;void Dir(string k)const;inline int CreatDir(string &k)const;inline bool deletefile(string &k)const;inline bool Cd(string k)const;inline void help()const;inline int deldir(string &k)const;inline int FunClass:Command(string &CommandName)constif(CommandName=new)return 1;else if(CommandName=open)return 2;else if(CommandName=write)return 3;else if(CommandName=copy)return 4;else if(CommandName=cd)return 5;else if(CommandName=rename)return 6;else if(CommandName=dir)return 7;else if(CommandName=mkdir)return 8;else if(CommandName=delete)return 9;else if(CommandName=exit)return 10;else if(CommandName=help)return 11;else if(CommandName=rmdir)return 12;else return 13;inline bool FunClass:CreatFile(string &k)constFileOperatorOut a(k);if(a.ofile)return true;return false;inline bool FunClass:OpenFile(string &k)constFileOperatorIn a(true,k);if(a.ifile)couta.readfile()endl;return true;else return false;inline void FunClass:WriteInFile(string &k)conststring t;FileOperatorOut a(k);cout请输入需要写入的内容:endl;getline(cin,t);a.WriteFile(t);inline bool FunClass:CopyFile(string &SourceFile,string &NewFile)constFileOperatorIn in(true,SourceFile);if(in.ifile.fail()cout打开文件失败!endl;return false;FileOperatorOut out(NewFile);if(out.ofile.fail()cout创建新文件失败!endl;return false;/创建文件失败elseout.ofilein.ifile.rdbuf();return true;/复制文件inline void FunClass:ReName(string &k,string &NewName)constifstream in(k.data();if(in)/如果文件存在in.close();if(!rename(k.data(),NewName.data()/删除成功coutk 成功重命名为: NewNameendl;else/无法重命名:文件打开或无权限执行重命名cout文件无法重命名(可能原因如下):endl coutt1. NewName 已存在endlt2. NewName 正在使用,未关闭. endlt3. 你没有权限重命名此文件.endl;else/文件不存在coutk 不存在,无法重命名.endl;void FunClass:Dir(string k)constk.insert(k.length(),*.*); _finddata_t file; long lf;if(lf = _findfirst(k.data(), &file)=-1l)/_findfirst返回的是long型; long _cdecl _findfirst(const char *, struct _finddata_t *) cout文件没有找到!n; else coutn文件列表:n; while( _findnext( lf, &file ) = 0 )/int _cdecl _findnext(long, struct _finddata_t *);如果找到下个文件的名字成功的话就返回0,否则返回-1 ; if(file.attrib = _A_NORMAL)cout 普通文件 ; else if(file.attrib = _A_RDONLY)cout 只读文件 ; else if(file.attrib = _A_HIDDEN )cout 隐藏文件 ; else if(file.attrib = _A_SYSTEM )cout 系统文件 ; else if(file.attrib = _A_SUBDIR)cout 子目录 ; else cout 存档文件 ; coutendl; _findclose(lf);inline int FunClass:CreatDir(string &k)constreturn _mkdir(k.data();inline bool FunClass:deletefile(string &k)constif(DeleteFileA(k.data()return true;return false; inline void FunClass:help()constcout所有的命令均由命令与参数组成,为(命令 参数 参数)的形式,所有参数不经特别说明均需要填写完整路径(不填写路径,默认程序当前运行目录)。endlnew file.*ttt创建一个新的文件。endlopen file.*ttt打开一个文本文件。endlwrite file.*ttt向一个现有的(如果没有则新建)的文件写入。endlcopy file1.* file2.*t复制一个现有的文件并粘贴到.。endlcd dirtttt进入某个目录。endlrename file1.* file2.*t将file1重命名为file2。endldir tttt显示当前目录下的文件及目录。endlmkdir pathttt创建一个新的目录。endldelete file.*ttt删除指定的文件。endlrmdir pathttt删除一个目录。endlhelptttt获得帮助。endlexittttt退出程序。endl;inline bool FunClass:Cd(string k)const _finddata_t file; long lf;if(lf = _findfirst(k.data(), &file)=-1l)return false; elsereturn true;inline int FunClass:deldir(string &k)constreturn _rmdir(k.data();2. fileclass.h文件(共三个文件)#include#include#includeusing namespace std;/单个文件的操作class BaseClass/基类,制定了创建文件与删除文件的基本操作public:BaseClass(string &name);BaseClass(bool a,string &name);virtual BaseClass();/关闭文件ofstream ofile;ifstream ifile;private:int flag;BaseClass:BaseClass(string &name):flag(1)ofile.open(name.data(),ios_base:out|ios_base:binary);BaseClass:BaseClass(bool a,string &name):flag(2)ifile.open(name.data(),ios_base:in|ios_base:binary);BaseClass:BaseClass()if(1=flag)ofile.close();ifile.close();class FileOperatorIn:public BaseClasspublic:FileOperatorIn(bool a,string &name):BaseClass(a,name)/打开一个文件inline string re
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 自建房赠予协议书
- 智能楼宇管理员岗位职业健康、安全、环保技术规程
- 自由锻锻工职业健康防护知识考核试卷及答案
- 分家协议书要点
- 金属制粉工外部培训转化考核试卷及答案
- 有机介质电容器纸、薄膜金属化工6s考核试卷及答案
- 送配电线路检修工设备安全技术规程
- 2025医疗设备采购合同
- 江苏省仪征市第三中学2026届数学七年级第一学期期末统考模拟试题含解析
- 现代金融体系的形成与资本市场的发展
- 2025河北水发节水有限公司公开招聘工作人员16人笔试参考题库附答案解析
- 新版中华民族共同体概论课件第十二讲民族危亡与中华民族意识觉醒(1840-1919)-2025年版
- 2025-2026学年人教版(2024)九年级物理全册第十四章 内能的利用(单元同步检测练习)(含答案)
- 第1课时 10的加、减法(教学设计)-2024-2025学年一年级上册数学人教版
- 2025至2030中国聚烯烃行业项目调研及市场前景预测评估报告
- 夜间红外成像算法优化-洞察及研究
- 2025四川达州宣汉县国有资产管理服务中心县属国有企业招聘劳动合同职工26人笔试历年参考题库附带答案详解
- 外国戏剧史课件
- (正式版)DB15∕T 4179-2025 《输氢管道工程施工规范》
- DB61T 1188-2018 足部修护技术规范
- 小区内垃圾清运合同范本
评论
0/150
提交评论