ImageVerifierCode 换一换
格式:DOCX , 页数:40 ,大小:448.80KB ,
资源ID:9392702      下载积分:3 金币
快捷下载
登录下载
邮箱/手机:
温馨提示:
快捷下载时,用户名和密码都是您填写的邮箱或者手机号,方便查询和重复下载(系统自动生成)。 如填写123,账号就是123,密码也是123。
特别说明:
请自助下载,系统不会自动发送文件的哦; 如果您已付费,想二次下载,请登录后访问:我的下载记录
支付方式: 支付宝    微信支付   
验证码:   换一换

加入VIP,免费下载
 

温馨提示:由于个人手机设置不同,如果发现不能下载,请复制以下地址【https://www.bdocx.com/down/9392702.html】到电脑端继续下载(重复下载不扣费)。

已注册用户请登录:
账号:
密码:
验证码:   换一换
  忘记密码?
三方登录: 微信登录   QQ登录  

下载须知

1: 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。
2: 试题试卷类文档,如果标题没有明确说明有答案则都视为没有答案,请知晓。
3: 文件的所有权益归上传用户所有。
4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
5. 本站仅提供交流平台,并不能对任何下载内容负责。
6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

版权提示 | 免责声明

本文(文件分割器.docx)为本站会员(b****7)主动上传,冰豆网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。 若此文所含内容侵犯了您的版权或隐私,请立即通知冰豆网(发送邮件至service@bdocx.com或直接QQ联系客服),我们立即给予删除!

文件分割器.docx

1、文件分割器仲恺农业工程学院操作系统课程设计课程设计题目 :文件分割器姓 名 :陈瑞鑫院(系) :计算机科学与工程学院专业班级 :计算机科学与技术071班学 号 :200710214111指导教师 : 闫大顺设计日期 :2010 年 6月23日目 录文件分割器(File spliter) 11. 绪论 11.1. 课题内容 11.2. 依据的操作系统原理 12. 需求分析 22.1. 总述 22.2. 程序功能要求 33. 系统设计 33.1. 开发环境 33.2. 总体设计 43.3. 模块设计 63.3.1. 模块结构图 63.3.2. 模块说明 63.3.3. 功能设计 73.3.4. 界

2、面设计 74. 系统实现 94.1. 文件分割模块、合并模块 94.1.1. 类说明 114.1.2. 文件操作 114.1.3. 编程思路和步骤 144.2. 分割、合并线程模块 154.2.1. 类图 154.2.2. 算法分析与设计 164.2.3. 显示进程操作状态 194.3. 文件选择模块 224.3.1. 类图 224.3.2. 源文件选择函数构造 234.3.3. 目标文件选择函数构造 234.4. 特色功能模块 245. 系统测试 255.1. 功能测试 255.2. 程序问题分析 285.2.1. LR(0)分析程序工作的正确性 285.2.2. LR(0) 语法分析器的错

3、误恢复策略 285.3. 程序的扩展性 296. 用户手册 306.1. 运行环境 306.2. 功能说明 317. 课程总结 328. 参考文献 33文件分割器(File spliter)1. 绪论1.1. 课题内容本设计主要是使用Visual C+ 6.0进行开发,通过面向对象分析和设计实现对文件的切割和合并操作,其中关键部分在于调用操作系统以及MFC提供的API函数,对进一步学习操作系统有重要意义。1.2. 依据的操作系统原理操作系统的功能之一是对计算机系统的软件资源进行管理,而软件资源通常是以文件形式存放在磁盘或其它外部存储介质上的,对软件资源的管理是通过文件系统来实现的。在计算机系统

4、中,软件资源非常重要,对软件资源的使用也相当频繁,因此文件系统在操作系统中占有非常重要的地位。文件系统具备的功能有:实现文件的按名存取,分配和管理文件的存储空间,建立并维护文件目录,提供合适的文件存取方法,实现文件的共享与保护,提供用户使用文件的接口。 文件系统的层次模型如图1-1所示。逻辑文件系统层文件组织模块层基本文件系统层基本I/O控制层图1-1 文件系统的层次模型本设计开发了在辅助进程中分割文件和合并文件的文件分割器,文件之所以能被分割,是与文件在计算机中存储方式密切相关的。所有文件都以二进制的形式存储于介质(包括硬盘、软盘等外部存储器)中。计算机在读取文件时,总是把数据转换成二进制形

5、式,然后再根据文件系统的相应规定分别进行处理。因此,所有文件都可以以二进制格式进行读写、分割,然后再以二进制的格式把分割后的文件重新合并起来。2. 需求分析2.1. 总述为了方便用户使用文件系统,文件系统通常向用户提供各种调用接口。用户通过这些接口来对文件进行各种操作。对文件的操作可以分为两大类:一类是对文件自身的操作,例如,建立文件,打开文件,关闭文件,读写文件,等等;另一类是对记录的操作(最简单的记录可以是一个字符),例如,查找文件中的字符串,以及插入和删除,等等。所谓文件的“打开”,是指系统将指名文件的属性(包括该文件在外存上的物理位置)从外存拷贝到内存打开文件表的一个表目中,并将该表目

6、的编号(或称为索引)返回给用户。以后, 当用户再要求对该文件进行相应的操作时,便可利用系统所返回的索引号向系统提出操作请求。系统这时便可直接利用该索引号到打开文件表中去查找,从而避免了对该文件的再次检索。这样不仅节省了大量的检索开销,也显著地提高了对文件的操作速度。如果用户已不再需要对该文件实施相应的操作时,可利用“关闭”(close)系统调用来关闭此文件,OS将会把该文件从打开文件表中的表目上删除掉。文件分割器主要是为了解决实际生活中携带大文件的问题,由于存储介质容量的限制,大的文件往往不能够一下子拷贝到存储介质中,这只能通过分割程序把的文件分割多 个可携带小文件,分步拷贝这些小文件,从而实

7、现携带大文件的目的。而合并器的作用则能够把这些分割的小文件重新合并,恢复原来的文件。Visual C+ 6.0中提供的许多处理文件的类库,通过这些类能够简捷、灵活的实现对文件的操作。2.2. 程序功能要求通过本学期对操作系统这门课程的学习,以及在操作系统的实验课上学到的理论知识和实践进行了这次操作系统的课程设计,这次课程设计主要完成对文件分割器的实现,该程序具有如下功能:(1)源文件的浏览选择,采用对话框形式。(2)目标文件夹的选择,同样采用对话框形式。(3)文件分割操作。(4)提供选择文件分割后是否删除源文件。(5)文件合并操作。(6)提供选择文件合并后是否删除源文件。在实际工作中,经常会遇

8、到一些比较大而自己非常需要的文件无法一次性地转存,或者在网络传输文件时无法一次性传输较大文件,这时就需要对文件进行分割,将大文件划分为多个较小的块,从而分次携带,最后再恢复。本程序主要采用窗口类和控件组装成整个界面,内部对象和类均使用MFC基类所派生和构造,使整个设计过程更易于实现和操作。3. 系统设计3.1. 开发环境开发平台: Windows XP + Visual C+ 6.0开发使用框架:MFC AppWizard(exe)-Dialog based开发语言: C+建立MFC界面过程如图2-1所示。图2-1 MFC AppWizard3.2. 总体设计程序基于Visual C+ 6.0

9、开发。程序通过MFC向导建立后,Visual C+自动产生说明文件,即电子版根目录下的“ReadMe.txt”文本文件。然后通过一步步建立程序控件、类以及相关对象实现整个程序的完成,采用面向对象方法进行控制和完善,实现起来简单明了,并在这一个过程中给出了各个类的说明,可以参见“ReadMe.txt”文本文件,也可以详见模块设计的类说明和构造过程以及实现的具体功能。本程序的总体设计框架如图2-2所示。它用来设置对文件分割操作或文件合并操作的选择、待分割(或合并)文件的路径以及所产生的文件的存放目录和其他参数。当用户设置完成后,单击“分割”按钮或“合并”按钮,将会在对话框进度条中显示操作的进度。文

10、件分割操作将产生一系列与源文件相关的小文件,文件合并操作则能恢复原来的文件名。因此,只要熟悉Visual C+环境中文件的操作,文件分割器的设计并不困难。需要注意的是程序的组织,如多线程的实现,程序界面组织等。 图2-2 系统总体设计框架系统最终效果界面如图2-3所示。图2-3系统效果图3.3. 模块设计3.3.1. 模块结构图图2-4 各个模块间的传递关系3.3.2. 模块说明本程序主要分为四个模块:源文件选择模块、目标文件夹选择模块、文件分割模块、文件合并模块。源文件选择模块:本模块与操作系统提供的API函数调用一致,只要对MFC或者WIN 32有一定了解都可以很方便的设计出来。stati

11、c char BASED_CODE szSplitFilter = _T(All Files (*.*)|*.*|);static char BASED_CODE szMergeFilter = _T(All Files (1_*.*)|1_*.*|);由上面代码可以看到,本模块只提供文件的选择操作,并不限制文件类型的选择,这也就涉及到文件是二进制存储,不管什么类型的文件都可以进行分割、合并操作。目标文件夹选择模块:这个模块跟源文件选择模块类似,提供分割或者合并后文件的存放路径,这个路径和源文件选择的路径可以给我们提供对文件的存放操作。具体操作如下: CDirDialog dlg; if (d

12、lg.DoBrowse(this) = IDOK) m_strTargetPath = dlg.m_strPath; UpdateData(FALSE); 文件分割模块:首先根据所要分割文件的文件名在指定目录下创建一个二进制文件,然后从待分割的文件中读取指定大小的数据存入该文件,接着在创建一个同样大小的以二进制方式写入的文件,并从上一次读取后的文件指针的位置处开始读取数据。如此反复,直到待分割的文件的位置指针到达结束的位置。这样就把一个大文件分割成了若干个小文件,并且各个小文件不仅保存了大文件的文件名信息,而且各个小文件的文件名之间也存在一定的联系。这个模块是本程序的核心,它涉及文件分割的整个

13、过程,包括文件分割算法,创建分割线程等。为了能够在显示文件操作进度的对话框中显示操作的状态,分割文件和合并文件应该在辅助线程中完成。文件合并模块:根据某个目录下文件名的规律依次把各个小文件读入至一个新创建的大文件中。这个模块在本程序设计中也是处于重要地位。程序首先找到需要合并的源文件,其中关键的信息在于文件名的判别,通过序列的名字依次对每个分割文件进行合并,最终在目标文件夹下完成合并后文件的写入操作,实现文件的合并。3.3.3. 功能设计(7)文件分割。(8)文件合并。(9)提供文件分割后删除源文件的选择。(10)提供文件合并后删除源文件的选择。(11)文件分割的进程提示,通过进度条方法。(1

14、2)文件合并的进程提示,通过进度条方法。3.3.4. 界面设计右上方提供源文件选择按钮,可以通过点击它实现对文件的浏览选择,具体设计如图3-1所示。图3-1选择源文件 源文件的选择过程对话框的设计如图3-2所示。图3-2 源文件的选择过程对目标文件目录的选择对话框的设计如图3-3所示。图3-3 目标文件夹的选择文件分割进度条窗口设计如图3-4所示。图3-4 文件分割过程4. 系统实现4.1. 文件分割模块、合并模块文件分割模块主要使用的类有CSplitFileDlg类、CSplitFileThread类、CSplitProgDlg类,与之关联的有CProgMergeDlg类,CMergeThr

15、ead类,它们之间的关系如类图4-1所示。图4-1 文件分割模块类和其他类的关系4.1.1. 类说明表4-1 文件分割类说明表名称属性说明m_filename数据成员文件名m_RatioSplit数据成员分割文件选择按钮m_checkMerge数据成员合并后删除源文件按钮m_sourcePath数据成员源文件路径m_checkSplit数据成员合并后删除源文件按钮m_targetBrowse数据成员目标文件夹选择浏览m_sourceBrowse数据成员源文件选择浏览m_strSource数据成员存放源文件m_strTargetPath数据成员存放目标路径m_split数据成员分割操作m_hlc

16、on数据成员图标变量MergeFlie成员方法合并文件按钮SplitFile成员方法分割文件按钮CSplitFileDlg成员方法文件分割窗口OnSysCommand成员方法系统自定义函数OnPaint成员方法绘图函数OnQueryDragIcon成员方法查询icon图标函数OnMergeratio成员方法合并按钮选择操作OnSplitratio成员方法分割按钮选择操作OnMerge成员方法合并文件OnTargetBrowse成员方法目标文件夹选择操作OnDestory成员方法销毁对象OnSplit成员方法分割文件操作OnSourceBrowse成员方法源文件选择操作4.1.2. 文件操作在V

17、C+中进行文件操作,可以使用SDK函数,但更为简单的是使用MFC中的CFile类。该类具有以下特点:CFileException类相结合,可以非常方便地处理操作异常。:与Archive类结合使用,可以方便地实现文件的序列化。下面讨论一下MFC中CFile类。CFile类具有三种形式的构造函数,它们的原型如下:CFile();:Cfile(int hFile);:Cfile(LPCTSTR lpszFileName, UNIT nOpenFlag);第一个函数形式为默认的构造函数。第二个函数形式用来将一个已经存在的文件与CFile对象相关联,参数为文件的句柄。需要指出的是:这里不检查文件的访问模

18、式和类型,在释放CFile对象时不会自动关闭该文件,需要手动关闭。第三个函数形式用来创建一个CFile对象并以指定的方式打开了一个指定路径的文件。它实际上是使用默认构造函数构造CFile对象并调用CFile类成员函数Open两个步骤。有关的函数操作将在介绍Open函数时详细讨论。创建了CFile对象后,就可以对文件进行操作了。1. 打开文件在进行其他操作之前,首先需要调用Open函数打开文件,该函数的原型为:BOOL Open(LPCTSTR lpszFileName, UNIT nOpenFlag, CFileException* pError = NULL);其中,参数lpszFileNa

19、me用来指定待打开文件的路径名;参数nOpenFlag表示共享和访问模式,它指定在文件打开后进行何种操作。它可以是以下一个或几个取值的组合:(1) CFile:modeCreate:创建一个文件。若该文件已经存在,则将文件清空。(2) CFile:modeTruncate:该值必须与CFile:modeCreate一起使用,表示在创建一个文件时,若该文件已经存在,不将其清空,并且不管打开的文件是新建的还是已存在的,该文件都具有打开保护的属性。(3) File:modeRead:打开文件并且其属性为只读。(4) File:modeWrite:打开文件并且其属性为只写。(5) CFile:mode

20、ReadWrite:打开文件并且其属性为可读可写。(6) CFile:modeNoInherit:打开的文件不允许被子进程所继承。(7) CFile:shareDenyNone:打开的文件不拒绝其他进程的读写。若该文件正在被其他进程以兼容的方式访问,则文件打开失败。(8) CFile:shareDenyRead:文件打开后拒绝其它进程进行读操作。若该文件正在被其他进程以兼容的方式访问,则文件打开失败。(9) CFile:shareDenyWrite:文件打开后拒绝其他进程进行写操作,若该文件正在被其他进程以兼容的方式访问,则文件打开失败。(10) CFile:shareExclusive:文件

21、打开后被该进程独占,拒绝其他进程对此文件进行访问。若该文件正在被其他进程以任何读写方式打开,则文件打开失败。(11) File:shareCompact:该标志不被32位MFC支持。(12) CFile:typeText:以文本方式打开。(13) CFile:typeBinary:以二进制方式打开。参数pError用于指定接受打开操作错误的CFileException对象指针,若取NULL,则文件打开时不会产生异常。否则会产生异常,从中可获得相应的错误信息。2. 读写文件打开文件后,就可以调用Read和Write成员函数对文件进行读写操作了。Read函数的原型如下:UNIT Read(void

22、* ipBuf,UNIT nCount);其中,参数lpBuf是接收读取数据的缓冲区的指针:参数nCount用来指定读取文件的最大字节数。函数返回实际读取的字节数。Write函数的原型如下:UNIT Read(const void* ipBuf,UNIT nCount);其中,参数lpBuf是保存待写入数据缓冲区的指针;参数nCount为数据的最大写入字节数。Write函数返回实际写入的字节数。需要指出的是,Read和Write函数最大只能读写64KB的数据。为此CFile类提供了ReadHuge和WriteHuge函数用来读写大型文件。这两个函数与上述的Read和Write函数类似,在此不再

23、赘述。3. 动文件位置指针CFile类提供了一系列成员函数来控制文件位置指针的移动。其中,SeekToBegin和SeekToEnd用来将文件指针移至文件的开头和结尾部分。而Seek函数可以将指针移至文件中的指定位置,该函数原型为:LONG seek(LONG lOff,UINT nFrom);参数lOff用来指定指针移动的字节数;参数nFrom用来指定移动的初始位置,它可以取如下值:(1) File:begin:从文件开始处向后移动lOff字节。(2) CFile:current:从文件当前位置移动lOff字节。(3) CFile:end:从文件结束位置向前移动lOff字节,此处的lOff应

24、为负数。4.1.3. 编程思路和步骤1. 文件分割器的编程思路文件之所以能被分割,是与文件在计算机中存储方式密切相关的。所有文件都以二进制的形式存储于介质(包括硬盘、软盘等外部存储器)中。计算机在读取文件时,总是把数据转换成二进制形式,然后再根据文件系统的相应规定分别进行处理。因此,所有文件都可以以二进制格式进行读写、分割,然后再以二进制的格式把分割后的文件重新合并起来。分割文件的具体方法是:首先根据所要分割文件的文件名在指定目录下创建一个二进制文件,然后从待分割的文件中读取指定大小的数据存入该文件,接着在创建一个同样大小的以二进制方式写入的文件,并从上一次读取后的文件指针的位置处开始读取数据

25、。如此反复,直到待分割的文件的位置指针到达结束的位置。这样就把一个大文件分割成了若干个小文件,并且各个小文件不仅保存了大文件的文件名信息,而且各个小文件的文件名之间也存在一定的联系。合并文件的方法是:根据某个目录下文件名的规律依次把各个小文件读入至一个新创建的大文件中。因此,只要熟悉Visual C+环境中文件的操作,文件分割器的设计并不困难。需要注意的是程序的组织,如多线程的实现,程序界面组织等。2. 文件分割器的编程步骤(1) 编辑应用程序对话框模板。如图所示为编辑对话框模板IDD_FILESPITTER_DIALOG。(2) 向主对话框类添加成员变量。在主对话框类中添加与对话框模板控件相

26、关联的成员变量和其他附加变量,如表4-2所示。(3) 创建用于分割文件和合并文件的线程类。为了能够在显示文件操作进度的对话框中显示操作的状态,分割文件和合并文件应该在辅助线程中完成。为此需要创建用于分割文件和合并文件的线程类CSplitThread和CMergeThread。它们派生自CWinThread类。表4-2 主对话框类说明表控件ID变量类型对应变量变量功能IDC_MERGECHECKCButtonm_checkMerge合并后删除IDC_SOURCE_BROWSECButtonm_sourcebrowse被分割文件选择I DC_SOURCEPATHCStringm_strSource

27、Path被分割文件的路径CEditm_sourcePath编辑路径IDC_SPLITCHECKCButtonm_checkSplit分割后删除IDC_SPLITRADIOCButtonm_RadioSplit分割文件IDC_TARGER_BROWSECButtonm_targetBrowse目标文件选择IDC_TARGERPATHCStringm_strTargetPath目标文件路径无BOOLm_bSplit分割/合并文件无CStringm_strFileName源文件文件名4.2. 分割、合并线程模块线程模块分为分割文件线程和合并文件线程,创建了用于分割文件和合并文件的线程类,即线程类CS

28、plitThread和CMergeThread。4.2.1. 类图图4-2 分割线程类类图图4-3 合并线程类类图4.2.2. 算法分析与设计创建用于分割文件和合并文件的线程类。为了能够在显示文件操作进度的对话框中显示操作的状态,分割文件和合并文件应该在辅助线程中完成。为此需要创建用于分割文件和合并文件的线程类CSplitThread和CMergeThread。它们派生自CWinThread类。其中,类CSplitThread定义如下:class CSplitProgDlg;class CSplitThread : public CWinThreadpublic: DECLARE_DYNAMI

29、C(CSplitThread) CSplitThread(CSplitProgDlg *pWnd); virtual CSplitThread();/ Attributespublic:/ Operationspublic:/ Overrides / ClassWizard generated virtual function overrides /AFX_VIRTUAL(CSplitThread) public: virtual BOOL InitInstance(); virtual int ExitInstance(); /AFX_VIRTUAL/ Implementationpubli

30、c: int m_len; BOOL m_bErrResult; CSplitProgDlg *m_pDlg; / Generated message map functions /AFX_MSG(CSplitThread) / NOTE - the ClassWizard will add and remove member functions here. /AFX_MSG DECLARE_MESSAGE_MAP()protected: BOOL m_check; void SplitFile();由于该进程将文件分割进度对话框CSplitProgDlg启动和终止,因此,应当有CSplitProgDlg类的成员变量m_pDlg来建立它们之间的联系。成员变量m_len和m_check分别表示文件分割成多少文件以及分割完成后是否删除源文件。成员变量m_bErrResult用来表示操作的错误信息。当分割文件启动时,该线程类的InitInstance函数将调用成员函数SpliF

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1