李科长的烦恼:企业团队问题名师(完整版)资料_第1页
李科长的烦恼:企业团队问题名师(完整版)资料_第2页
李科长的烦恼:企业团队问题名师(完整版)资料_第3页
李科长的烦恼:企业团队问题名师(完整版)资料_第4页
李科长的烦恼:企业团队问题名师(完整版)资料_第5页
已阅读5页,还剩78页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

李科长的烦恼:企业团队问题名师(完整版)资料(可以直接使用,可编辑优秀版资料,欢迎下载)

李科长的烦恼:企业团队问题名师(完整版)资料(可以直接使用,可编辑优秀版资料,欢迎下载)李科长的烦恼案例分析:本案例讲述的事某工科硕士院研究生毕业的刘平被原厂领导应邀回厂工作。因企业急需开发一些新产品,而此时李平的硕士毕业论文正是有关这方面的课题,而且该厂的领导对其以前的工作有良好的印象,企业决定任命李平为先技术科科长。她的工作是负责技术科的全面领导与企业新产品的开发工作。由于这批新产品的开发是相当复杂的工作,开发成功与否,对企业有重大影响。该厂成立新产品开发领导小组,由一位副厂长任组长,李平任副组长,但由于李平具体负责,小组成员还包括夏副科长、两名技术人员、销售科和供应科各一名副科长。但先前的技术科两位副科长,王副科长与夏科长关系不融洽,在两者之间处理工作关系时意见总是不一致,大家各执己见,在解决问题时这些建议又与李平建议向左,厂领导却并不明确表态,仅仅强调团结,李平感到十分为难。李平感到这个科长真是很难当。本案例中透露出的问题是目前国营企业中存在的普遍性问题,依据我对本文案例分析。主要问题是新产品开发领导小组缺乏团队管理方法所为、体现在如下几个问题上:1.企业对李科长的任命是负责技术科的全面领导。与新产品的开发工作,成员在工作开展中建议又与自己向左,厂领导此时不表态支持谁,团队定位不明确,矛盾与问题处理棘手。2.成立新产品开发领导小组,是有一位副厂长任组长,李平科长任副科长,但由李平具体负责,技术人员与管理人员分工不明确。3.两位副科长之间的关系不融洽,以自己的主观意识为主,带着无我组织不合作的态度,在时间进度上不能保证团队工作顺利进行。4.李平在分配工作任务、确定技术措施、进行产品设计等方面,都通过各种会议征求大家的意见,充分民主,共同商定。这种决定我看是刘平在对负责技术科的全面领导与新产品开发工作开展权限的授予没用到位。通过以上几点可看出,若想改善目前局面,要从以下方面着手解决问题:1.作为一个新产品开发项目领导小组,团队成员组成必需是为共同达到具体目标而建立的,所以在团队定位上需要厂长做出合理的小组成员选用与调配。具体负责人李平科长与夏副科长,王副科长任命应作调整,易于开展工作。2.我认为作为副厂长参与小组的目的是小组计划工作,气的事在管理实践进度与管理沟通上进行跟踪与协调作用。3.两位副科长之间的关系不融洽爱工作中会给工作完成滞后,早餐工作效率低下,以自己的主观意识为主,没有相互间的配合在新产品开发上项目完成时无法有结果的。4.作为科长的李平在分配工作任务、确定技术措施、进行产品设计等方面,应该先通过会议提议,各抒己见,共同商讨。最后定夺一个最有说服力的方案汇报厂长执行。本案例中可看出作为有技术专长的李平,在处理技术方面有自己独特的见解,可得不到厂领导的支持,在遇到团队管理方面的问题无能为力情况下,促使工作不能顺利进行,科里工作效率低,士气不高,感到这个科长真是很难当。我认为企业对原任命可以稍作强调一下,因王副科长老资历,任工作经验很丰富,与现有各位厂领导关系很好,所以可在小组管理过程中负责香雾完成过程中时间协调关系,而李平技术方面强,应在小组技术管理方面负责并下达执行。这样的执行过程中将管理进度上与管理技术上两者分两个小组,相互协助,才会使小组团结行动起来。事情将变简单化。才能体现团队小组的凝聚力。实现团队最终目标。通过以上案例项目开展是我深深地感到实际操作这个项目的不易,回顾全过程,我局的如果李平担任厂技术科科长工作,要想打开工作局面必须考虑在团队管理中如下几方面的管理措施:团队是为了解决一个具体问题,达到一个具体目标而建立的。在构成上分五要素:1.明确小组的团队目标。要明确本团队目前的实际情况,要知道没有目标这个团队就没有存在的价值。起咪表是全体成员奋斗的方向和动力,也是感召全体成员精诚合作的一面旌旗。2.团队管理上要有定位。团度在企业中处于什么位置由谁来选择和决定小组的决策,团队小组最终对谁负责,分工要明确,明晰职责,愤青团队采取什么样的方式来共同完成工作。3.成员的构成。小组成员之间的低位和身份最好相当,不能相差太大,人员的选择是团队中非常差重要的一个部分。在一个团队中可能需要有人出主意,有人顶计划,有人实施人,有人协调不同的人一起去工作,还有人去监督团队工作的进展等、不同的人通过分工来共同完成团队的目标,在人员选择方面要考虑人员的能力如何,技能是否互补,人员的经验如何。4.权限的划分与行人授权。对已授权的人员充分信任。信任是团队的成员合作基础。有了信任就要授权权限,并为起配合合适的资源。积极主动的与团队成员沟通,与团队成员保持畅通的信息交流,将团队管理体制如玉的手。5.计划的执行。目标的最终实现需要一些列具体行动,这里可以吧它理解为对该项目开发的实际进度与具体工作的程序计划,解决问题是根源。以上几要素是开展团队管理必须具备的,李平在开展工作中药敢于运用,在团队矛盾产生的情况下,要维护三角关系。维护本人的成员领导间团队整合,协调团队内部之间的关系,使组织高效率运转能力。要鼓励成员间的扶持,不可过于对抗。要在管理者权威和团队成员的判断力和自制力之间取得平衡。一个完善的团队,成员之间高度的互相信任,针对经过商讨后,管理者在做出最终决定时不必再讨论,因为已经是深思熟虑后了,做到充分相互信任。李平可借鉴成功团队要求来管理。1.要使成员之间的新连载一起,具有团队凝聚力2.强化成员间合作与配合关系、3.成员要明确团队的礼仪,团队的目标终于个人礼仪与目标,成功靠团队共同推进,成员要明白既然是团队行动,就要听从主要负责人的安排决定,具体执行起来就容易些。因此小组若能善用团队管理,就能激发成员潜能。协助问题解决,曾静成员组织认同,提升组织效率与效能,具有一定的功能。在发挥团队管理的效果,美味成员须先了解小组目标与市民及个人较色的责任,其次成员也须了解如何完成小组任务,最后要几集投入小组目标达成。李平在实际问题处理分歧建议时应事先会议讨论。听取大家意见,达成共识。所以李平在任命前应该与厂长进行沟通,说明自己的想法及成员关系处理问题与打算,而且要在上任时邀请厂长参加议会。并提议由厂长说出由目前复杂成员分工,使之关系明朗化,便于日后好开展工作。李平在担任科长工作时要做到以上提出的参考建议。给予小组进行合理分工。王副科长负责项目进度与协调工作,而自己与夏副科长负责产品技术开发试制问题,两方面相互理解,配合工作,各自作出合理可行的计划来。相互补充,最终做出果断决策,才可能解决根本性问题,才能提高工作效率,达到提高成员士气。河海大学《操作系统》课程设计设计名称:模拟文件管理系统课程设计负责人:课程设计成员:河海大学计算机与信息学院二〇一一年十二月目录Contents第一部分:课程设计目的 3第二部分:设计要求 3第三部分:运行环境 3第四部分:实验内容 44.1前期知识巩固 44.2设计任务 54.3详细设计部分 104.3.1数据结构 104.3.2主要函数 114.3.3系统流程图 11第五部分:调试分析 135.1用户登录 135.2创建文件 145.3查看文件 155.4删除文件 155.5修改文件夹位置 16第六部分:参考文献 16第七部分:附录 177.1心得体会 177.2源代码(代码文字已缩小) 17第一部分:课程设计目的本设计的目的是实现操作系统和相关系统软件的设计,其中涉及进程编程、I/O操作、存储管理、文件系统等操作系统概念。具体指在内存中开辟一个虚拟的磁盘空间作为文件存储器,在其上实现一个简单的单用户文件系统。在退出这个文件系统时应将该文件系统保存到磁盘上,以便下次可以再将它恢复到内存的虚拟磁盘空间中。第二部分:设计要求(1)对进行认真分析,列出实验具体步骤,写出符合题目要求的程序清单,准备出调试程序使用的数据。(2)设计一个10个用户的文件系统,每次用户可保存10个文件,一次运行用户可以打开5个文件。(3)程序采用二级文件目录(即设置主目录MFD)和用户文件目录(UFD)。另外,为打开文件设置了运行文件目录(AFD)。(4)文件保护简单使用三位保护码:允许读写执行、对应位为1,对应位为0,则表示不允许读写、执行。(5)以完整的论文形式提交原始代码、设计文档和可运行程序。提交的文档应当包括:设计题目,程序清单,运行结果分析,算法及其优缺点,以及通过上机取得了哪些经验。程序清单要求格式规范,注意加注释(包含关键字、方法、变量等),在每个模块前加注释。(6)本组交一份设计文档的同时每名组员交一份实践体会。第三部分:运行环境windowsxp系统,windows7旗舰版系统编译器:MicrosoftVisualC++6.0编辑语言:c++第四部分:实验内容4.1前期知识巩固A、文件系统:文件系统是操作系统的五大功能模块之一,主要实现操作系统对程序、数据、设备等的管理。文件系统的主要功能:完成文件存储空间管理,实现文件名到物理地址的映射,实现文件和目录的操作管理,提供文件共享能力和安全措施等功能。B、文件文件是信息的一种组织形式,是存储在外存上的带有标识号的一组相关信息的集合,而这个集合既可以由相关联的字符流组成,也可以由相关联的记录组成。文件的构成:文件控制块(FCB)、数据。FCB是系统在管理文件时所需信息的数据结构,是文件存在的惟一标志。包括了文件的基本属性,大致有文件名、地址、存取控制信息(如文件所有者、同组用户、访问权限)以及使用信息(如创建日期、修改日期)。C、文件目录文件控制块的有序集合称为文件目录。文件目录的基本功能是实现文件名与其存放位置的映射。D、文件的物理结构常用的结构有顺序结构、链接结构、文件分配表结构FAT、索引结构、多级索引结构。E、文件操作文件的操作就是创建/删除文件、打开/关闭文件、读/写文件等F、磁盘空间管理文件系统的一个重要任务是对磁盘空间进行管理。磁盘空间管理的关键问题是磁盘空闲空间的管理。常用的空闲块管理方法有:空闲文件目录法、空闲块链法、位示图法、空闲块成组链接法。4.2设计任务建立一个大文件,把它假象成一张盘,在其中实现一个简单的模拟Linux文件系统。在现有机器硬盘上开辟1M的硬盘空间,模拟作为作为设定的硬盘空间。编写一管理程序simdisk对此空间进行管理,以模拟Linux文件系统,要求:盘块大小1k空闲盘块的管理:Linux位图法结构:超级块,i结点区,根目录区该文件管理程序的功能要求如下:Format:对文件存储器进行格式化

mkdir:用于创建子目录

dir:用于显示目录

cd:更改当前目录create:创建文件

write:写文件read:读文件del:删除文件access:权限程序的总体流程为:初始化文件目录;输出提示符,等待接受命令,分析键入的命令;对合法的命令,执行相应的处理程序,否则输出错误信息,继续等待新命令,直到键入EXIT退出为止。总体流程图如下所示:是是登录输入命令退出退出失败成功否启动执行命令以下是各功能模块流程图:初始化当前状态读入i节点信息到内存当前目录为根目录初始化当前状态读入i节点信息到内存当前目录为根目录初始化超级块结束开始初始化函数format()是是否否遍历i节点区argv[1]=”..”目录是否存在找到的目录i节点号送当前目录inum_cur当前目录的父i节点号送当前目录inum_cur开始结束改变当前目录cd()是是是是否否遍历i节点区i节点的父节点是否为当前目录i节点区是否遍历完输出文件名或目录名开始结束显示目录dir()是是否否遍历i节点区要创建的目录是否存在是否有空的i节点遍历i节点区分配一个目录i节点开始结束创建目录mkdir()是是是是否否遍历目录索引要创建的文件是否存在是否有空的i节点遍历i节点区分配一个文件i节点开始结束创建文件creat()是否遍历i节点区要删除的文件是否存在释放文件对应的i节点区effect=0开始结束删除文件del()是是否是否是否遍历i节点区要打开的文件是否存在提示输入打开模式将打开文件信息写入打开文件信息表file_array[]遍历打开文件表file_array[]文件是否已经打开提示输入开始位置和读字节数调用读块操作,读出块内字符模式是否为可读开始结束开始结束打开文件open()读文件read()是是否是否遍历打开文件表file_array[]文件是否已经打开提示输入写入字节数调用写块操作,写入块内字符模式是否为可写是否遍历打开文件表file_array[]文件是否已经打开将打开文件表项标志位置-1file_array[i].inum=-1开始结束写文件write()开始结束关闭文件close()开始遍历i节点区开始遍历i节点区是待删除目录吗?遍历子目录子目录为空吗?是文件吗?是空目录吗?结束调用delet()删除目录或文件是空目录吗?删除目录树rd()是是否否否否否是是是开始当前是否有该文件是否为管理员是否为普通用户是公用么结束判断权限access()是否否否查找该文件是是有读写权限查找该文件是是是否遍历位示图表查找空闲块bitmap[]是否有空闲块分配一块,将位示图位置置’1’。返回找到的空闲块号将位示图位置置’0’。bitmap[i]='0清空块内容开始结束分配磁盘块get_blk()开始结束释放磁盘块release_blk(int)是是否输出给定i节点对应的第1块内容文件是否大于1块输出给定i节点对应的第2块内容是否将缓冲区buf内容写入第1块buf内容是否大于512字节将缓冲区buf的512字节后面的内容写入第2块开始结束写磁盘块write_blk(int)开始结束读磁盘块read_blk(int)4.3详细设计部分4.3.1数据结构定义功能描述数据结构typedefenumFileAccess文件元素可供操作性权限typedefenumFileType文件元素类型typedefenumUserType用户类型typedefenumFileStatus文件状态typedefstructFileIndexElement一个文件索引结构typedefstructFileIndex文件索引结构或目录表项typedefstructfbFileBlock文件块的结构typedefstructBitMap文件系统的位示图结构typedefstructSuperBlock;文件系统结构typedefstructUser用户信息typedefstructfseFSElement文件系统中的元素结构,包括文件和文件夹typedefstructCurrentStatus系统当前状态4.3.2主要函数定义功能描述函数unsignedFindBlankFileBlockId()char*FindBlankFileBlock(unsignedfileblockid)寻找第一个文件块地址voidGetCurrentTime(char*currtime)得到当前时间的字符串voidAddFileIndex(unsignedfileblockid,unsignedfilelevel,char*filename,char*parentname,FileTypetemp)更新文件索引voidUpdateBitMap(unsignedfileblockid)更新位示图FSElementCreateFileElement(FileAccessacc,char*filename,FileTypetype,char*filecontent,FSElement*parent)创建一个文件元素FileBlock*CreateFileBlockList(char*datahead,unsignedblockcap,unsignedlen)创建文件块链表boolInitFileSys()初始化模拟文件系统boolLogin()voidCreate(char*filename)系统登录模块创建一个文件voidDir(char*path)列出当前目录的文件和文件夹voidMkdir(char*filename)创建一个文件夹voidCd(char*path)进入一个文件夹voidDelete(char*path)删除当前目录的文件数据结构voidFindCommKey(char*command,char*key,char*path)命令分解voidShell()命令解释模块voidClearFileSys(退出时清理分配的内存空间4.3.3系统流程图(1)Login用户登录用户输入用户名和密码,在passwd文件中查找是否有此用户,核对密码。正确则登陆成功,当前目录设定到当前用户文件夹下。(2)format格式化初始化超级块,初始化主目录,初始化管理员admin目录,初始化用户目录,初始化用户passwd文件。(3)create创建文本文件查找当前目录下是否有同名文件,是则退出,否则让用户输入文本文件内容,以‘###’结束。申请硬盘空间,申请失败则结束。将文件内容写入硬盘空间。修改当前目录的结构,修改超级块。(4)cdir创建文件夹查找当前目录下是否有同名文件,是则退出,否则,申请硬盘空间,申请失败则结束。将文件夹内容写入硬盘空间。修改当前目录的结构,修改超级块,写入模拟硬盘。(5)readedit–读取和追加文本文件(6)Read查找当前目录下是否该文件,没有则退出,否则调用access()权限判断,有权限则判断是不是文件,不是则退出,是文件则读取文件并显示。(7)Edit调用读取文件模块,读取成功则用户输入追加的内容,如果追加的内容大于一个硬盘分配空间则申请分配空间,失败则退出,申请成功则保存文件。(8)access(文件名)权限判断先判断当前目录是否有该文件,在当前目录的硬盘空间找到该文件,判断当前登录用户是哪个组,判断是否该用户创建,判断该文件的可见级别。如果是该用户创建的则有读写权限如果当前用户是管理员组的也具有读写权限如果该文件是用户可查看文件则都具有权限。(9)cd–进入子目录或上级目录查找当前目录是否有该子目录,没有则退出,调用access()判断当前用户是否有权限,无则退出,有则读取该子目录的目录,将当前目录指向该目录。(10)attr(文件名)查看文件或者文件夹的属性先查找当前目录下是否有该文件或目录,有则判断文件是否系统文件,是否文本文件,是否目录,由谁创建,属于什么组,占用的空间和目录。将其全部显示出来。(11)del删除文件或目录查找当前目录是否有该文件名,没有则退出,有则调用access()判断是否有权限,有则判断是否为系统文件,是则无法删除,不是则判断是否是文件,是文件则直接删除,不是则判断是否文件夹,是文件夹则判断该文件夹下是否有文件,有文件则无法删除。提示用户是否删除,确认则删除文件,修改当前文件夹目录和硬盘空间结构,修改超级块,写入模拟硬盘。(12)Dir列文件目录(列出文件名、物理地址、保护码和文件长度)第五部分:调试分析5.1用户登录初始登陆界面,根据注册用户的信息,每次登陆有三次登陆机会,如果失败即结束并退出,用户名和验证码与注册的信息一致则进入系统,下图显示的是登陆时失败的画面:登陆成功后画面显示:5.2创建文件创建文件并输入文件内容,我们的创建文件模式为“CREAT+文件名称”,下图的名称为123,之后系统显示输入文件内容,同时会提醒内容以“###”结尾,此便于系统识别,具体画面如下所示:下面是创建文件夹,文件夹不需要输入文件信息。5.3查看文件根据之前创建的文件,可以查看当前文件夹中已经创建文件的信息。命令“dir”。5.4删除文件创建文件夹并删除,创建文件夹的命令为“CDIR+文件夹名称”,下图以123为例;删除命令为DEL+文件夹名称/文件名称,下图还以AAA文件夹为例,如下图所示:删除后查看,可以验证文件已经删除。5.5修改文件夹位置第六部分:参考文献[1]罗宇等.《操作系统(第2版)》.电子工业出版社[2]谭浩强.《C++程序设计》.清华大学出版社

[3]宁正元等.《算法与数据结构》.清华大学出版社

[4]林锐.《高质量程序设计》.电子工业出版社[5]张乃孝.《算法与数据结构-c语言描述》(第二版).高等教育出版社[6]严蔚敏等.《数据结构(C语言版)》.清华大学出版社[7]苏仕华等.《数据结构课程设计》.机械工业出版社[8]第七部分:附录7.1心得体会在本次课程设计刚刚开始时,不知道怎么设计,只知道大概的结构。后来认真阅读课本有关的知识,知道怎样设计结构体才方便文件操作。知道怎样设计后,写程序时也遇到很多的障碍,特别是指针的改接和指向和出错处理。此时深感自己编程能力的不足,经过多次修改,终于设计好了该设计。通过该课程设计,使我们更了解了课本知识,巩固了课本知识,同时也使我们的编程能力有了一定的提高,最重要的是我们深切体会到团队的重要,怎么配合和分工才能更快更好的完成任务。7.2源代码(代码文字已缩小)#include<iostream>#include<time.h>#include<string>#include<fstream>#include<sstream>#include<stdlib.h>#include<stdio.h>#include<string.h>#include<iomanip>#include<io.h>#include<malloc.h>#include<dos.h>#include<conio.h>#include<windows.h>#defineBOOLintusingnamespacestd;constunsignedFILE_SYS_SIZE=1024*1024;//模拟文件系统的容量设为1MconstunsignedBITMAP_LEN=64;//位示图的长度512/8constunsignedBLOCK_SIZE=512;//一个文件块的大小constunsignedBLOCK_COUNT=512;//文件系统中文件块的数量constunsignedNAME_LEN=15;//最长文件名的长度constunsignedPASSWORD_LEN=15;//用户密码的最大长度constunsignedLOGIN_COUNT=3;//用户登录尝试次数constunsignedCOMMAND_LEN=200;//命令行最大长度constunsignedPRO_SET_COMM_COU=11;//预设命令数constunsignedUSER_NAME_SIZE=15;//最大用户名长度constunsignedUSER_PASSWORD_SIZE=15;//最大用户密码长度constunsignedMAX_USER_NUMBER=10;//最多用户数目constunsignedMAX_FILE_SIZE=200;//最大文本字符数目constchar*PRO_SET_COMM[]={"creat","format","read","write","logout","del","cdir","cd","dir","exit","help"};//文件元素可供操作性权限typedefenum{pub,//任何人可做任何操作(公共文件,所有人都可查看)protect,//非创建者或ADMIN,只可以察看(保护,只有自己和管理员可查看)pri//非创建者或ADMIN,不可以做任何操作(系统文件)}FileAccess;//文件元素类型typedefenum{file,//文件dir//文件夹}FileType;//表示文件状态typedefenumFileStatus{closed,opened,reading,writing};//一个文件索引结构(文件节点)structFileIndexElement{unsignedIndex;//文件元素索引编号charFileName[NAME_LEN];//文件元素名charParentName[NAME_LEN];//父节点名unsignedFileBlockId;//文件元素所在物理块编号unsignedFileLevel;//文件元素所在层次,层+文件元素名为一个文件元素的逻辑位置charcreatTime[18];//文件创建时间char*filecontent;//文件内容BOOLeffect;//是否有效,0-无效,1-有效FileTypeType;//识别文件还是目录};//文件索引结构或目录表项(文件目录结构)structFileIndex{FileIndexElement*FIStart;//文件系统中的文件索引起始位置unsignedFILen;//文件索引的最大长度unsignedFICount;//文件索引数量};//文件块的结构(存储数据块结构)structFileBlock;typedefstructFileBlock*pFileBlock;structFileBlock{unsignedFileBlockId;//文件块编号unsignedBLOCK_SIZE;//文件块的容量char*FileBlockAddr;//文件块地址pFileBlocknext;//下一个文件块的地址};//文件系统的位示图结构(用于显示分配的存储器分配情况)structBitMap{unsignedBITMAP_LEN;//文件位示图长度char*BMStart;//位示图的起始指针};//文件系统结构(超级块的结构,全局变量)structSuperBlock{char*FSStart;//文件系统的起始地址unsignedSuperBlockSize;//文件系统的容量BitMapbm;//文件系统中的位示图unsignedBLOCK_COUNT;//文件系统中文件块的数量pFileBlockhead;//文件系统中文件块首地址FileIndexFI;//文件系统中的文件索引};//登陆用户的数据结构(用户的数据结构)structUser;typedefstructUser*pUser;structUser{char*UserName;//用户名称char*password;//用户密码intisAdmin;//用户类型,1表示管理员,0表示用户pUserNextUser;};structLoginStruct{intUser_Login_tims; intUserNum; pUserpUserList;};//文件系统中的元素结构,包括文件和文件夹(逻辑文件的定义,树形结构)structFSElement;typedefstructFSElement*pFSElement;structFSElement{pFSElementparent;//指向自己的父亲节点unsignedFileLevel;//文件元素所在层次,层+文件元素名为一个文件元素的逻辑位置charFileName[NAME_LEN];//文件元素名unsignedFileBlockId;//文件元素所在物理块编号unsignedFileElemLen;//文件元素的长度FileTypeType;//文件元素类型FileAccessAccess;//文件元素可供操作的权限UserCreator;//文件创建者charCreateTime[18];//创建时间,日期格式:MM/DD/YYHH:MI:SScharLastModTime[18];//最后一次修改时间char*FileData;//一个文件的数据开始地址,文件夹时该值为NULLFileStatusfileStu;//如果是一个文件表示文件当前的状态};//系统当前状态structCurrentStatus{UserCurrentUser;//当前用户unsignedFileLevel;//用户所在文件系统层FSElement*CurrParent;//当前层的父节点char*CurrentPath;//当前路径};SuperBlockFS;//一个全局文件系统的变量CurrentStatusCS;//当前系统状态FSElement*base;//文件元素的根LoginStructLoginS;//用户列表,在登录的时候用到,以链表形式存储boolInitFileSys();//(初始化文件函数)//========================================================================================//函数说明:权利声明voidRight(void){ cout<<"文件管理系统[版本1.4]\n"; cout<<"版权所有(c)2021计算机4班。保留所有权利。\n\n"; return;}//==========================================================================================//函数介绍:寻找第一个空白的文件块ID//返回值:返回第一个空白块的IDunsignedFindBlankFileBlockId(void){unsignedcharc; //通过位示图查找可以简化 {if(c==0x7F) {returni*8;//一个字节左边第一位为0,表示该区域未使用 }if(c==0xBF) {returni*8+1; }if(c==0xDF) {returni*8+2; }if(c==0xEF) {returni*8+3; }if(c==0xF7) {returni*8+4; }if(c==0xFB) {returni*8+5; }if(c==0xFD) {returni*8+6; }if(c==0xFE) {returni*8+7; } }returnBLOCK_COUNT+1;}//================================================================================================//函数介绍:寻找第一个文件块地址(根据文件块ID,找文件块)//输入参数:fileblockid文件块ID//返回值:返回文件块的地址char*FindBlankFileBlock(unsignedfileblockid){FileBlock*fblock=FS.head;while(fblock->next!=NULL) {if(fblock->FileBlockId==fileblockid) {returnfblock->FileBlockAddr;//如果找到文件块,返回文件块的地址, }else {fblock=fblock->next; } }returnNULL;//没有找到,返回空。}//==================================================================================================//函数介绍:得到当前时间的字符串//输入参数:时间字符串的指针voidGetCurrent_Time(char*currtime){chardbuffer[9];chartbuffer[9];_strdate(dbuffer);//获得日期_strtime(tbuffer);//获得时间strcpy(currtime,dbuffer);strcat(currtime,"");strcat(currtime,tbuffer); //将两者拼接在一起,并用空格隔开}//=================================================================================================================//函数介绍:更新文件索引//输入参数:fileblockid文件块IDvoidAddFileIndex(unsignedfileblockid,unsignedfilelevel,char*filename,char*parentname,FileTypetemp){if(parentname==NULL) {//如果没有父亲节点的话,将其父亲节点格式化 }else { }}//==================================================================================================//函数介绍:更新位示图//输入参数:fileblockid文件块ID更改对应的位示图voidUpdateBitMap(unsignedfileblockid){//计复所在位示图的位置intdirInBitmap=((int)(fileblockid/8));intdirInChar=fileblockid%8;intxor;switch(dirInChar) {case0:xor=0x80;break;case1:xor=0x40;break;case2:xor=0x20;break;case3:xor=0x10;break;case4:xor=0x08;break;case5:xor=0x04;break;case6:xor=0x02;break;case7:xor=0x01;break; }*c=*c^xor;}//==================================================================================================================//函数介绍:创建一个文件元素//输入参数:acc文件元素可操作权限,filename文件元素名称,type文件元素类型,filecontent文件内容,parent指向其父节点//返回值:返回一个文件元素的指针pFSElementCreateFileElement(FileAccessacc,char*filename,FileTypetype,char*filecontent,FSElement*parent){unsignedblankFileBlockId=FindBlankFileBlockId();//寻找空闲的文件块char*blank=FindBlankFileBlock(blankFileBlockId);//blank为找的空白文件块的地址FSElement*fs=(FSElement*)blank;intflag=0; { //判断是否有完全相同的文件,(文件名,文件是否有效,文件的层次,文件的类型) {printf("文件名重复!\n");flag=1; returnNULL; } }//if(flag)returnNULL; //查找第一个空白文件块IDif(blankFileBlockId>=BLOCK_COUNT) { //如果没有空白的文件块存储的话printf("未找到一个文件块的id\n");returnNULL; }//查找第一个空白块的地址if(blank==NULL) {printf("未找到一个文件块的地址\n");returnNULL; }//更新索引表fs->Access=acc;//文件操作权限fs->Creator=CS.CurrentUser;//文件的创建者GetCurrent_Time(fs->CreateTime);//文件创建时间fs->FileBlockId=blankFileBlockId;//文件所在的文件快号fs->FileLevel=CS.FileLevel;//文件所在的逻辑层次strcpy(fs->FileName,filename);strcpy(fs->LastModTime,fs->CreateTime);//最后修改时间fs->Type=type;//文件类型fs->parent=parent;if(type==dir) {fs->FileElemLen=sizeof(FSElement);fs->FileData=NULL; }else { fs->FileElemLen=(unsigned)strlen(filecontent);//fs->FileElemLen=(unsigned)strlen(filename);fs->fileStu=closed;fs->FileData=(char*)fs+sizeof(FSElement);if(filecontent) {strcpy(fs->FileData,filecontent); } } { { } }//更新索引if(parent==NULL) {AddFileIndex(blankFileBlockId,CS.FileLevel,filename,NULL,type); }else {AddFileIndex(blankFileBlockId,CS.FileLevel,filename,parent->FileName,type); }//更新BITMAP位示图UpdateBitMap(blankFileBlockId);returnfs;}//==================================================================================================//函数介绍:创建文件块链表//输入参数:datahead第一块数据的地址,blockcap一个文件块的大小,len链表的长度//返回值:返回链表的头指针FileBlock*CreateFileBlockList(char*datahead,unsignedblockcap,unsignedlen){if(datahead==NULL||len==0) {returnNULL; }FileBlock*head;//文件块链表头指针FileBlock*pnew;FileBlock*pold;//将每个文件块分配内存空间head=pold=pnew=(FileBlock*)malloc(sizeof(FileBlock));for(unsignedi=0;i<len;i++) {pold->FileBlockId=i;pold->BLOCK_SIZE=BLOCK_SIZE;pold->FileBlockAddr=datahead+i*blockcap;memset(pold->FileBlockAddr,'\0',blockcap); //分别将每个文件块初始化,并将其文件块大小的空间格式化。if(i!=len-1) {pnew=(FileBlock*)malloc(sizeof(FileBlock)); }else {pnew=NULL; }pold->next=pnew;pold=pnew; }returnhead;}//====================================================================================================//函数介绍:初始化模拟文件系统//返回值:true-初始化成功,false-初始化失败boolInitFileSys(void){//初始化模拟的文件系统FS.FSStart=(char*)malloc(sizeof(char)*FILE_SYS_SIZE);//文件模拟大小,分配1M的空间大小if(FS.FSStart==NULL)//如果失败,返回 { cout<<"系统初始化失败。";returnfalse; }FS.SuperBlockSize=FILE_SYS_SIZE;//初始化文件系统空间大小//设置位示图为未使用 //作用,将从位示图的初始地址到,位示图大小的这段空间都置为空,空用'\0'表示 FS.BLOCK_COUNT=BLOCK_COUNT;//初始化文件系统索引 //文件块的首地址是从给定的地址减去分配给位示图之后的初始地址//因为是模拟系统,为简化问题,暂定一个文件或文件夹(一个文件元素)最多占用一个文件块,一个文件块只放一个文件元素 //包括所有文件索引的大小,以及两个记录信息的大小索引最大长度,文件索引数量//初始化文件块FS.head=CreateFileBlockList((FS.FSStart+FILE_SYS_SIZE-BLOCK_SIZE*BLOCK_COUNT),BLOCK_SIZE,FS.BLOCK_COUNT); //区域的后BLOCK_SIZE*BLOCK_COUNT个单元用来存储数据if(FS.head==NULL) { cout<<"系统初始化失败。";returnfalse; } //以上为初始化超级快,下面是初始化系统当前状态 //初始化系统当前状态CS.CurrParent=NULL;CS.FileLevel=0;CS.CurrentPath=(char*)calloc(COMMAND_LEN,sizeof(char));//初始化当前路径//创建一个根目录base=CreateFileElement(pub,"root",dir,NULL,NULL);if(base==NULL) { cout<<"存储空间不够。";returnfalse; }else { //下面是初始化用户列表 LoginS.User_Login_tims=0; LoginS.UserNum=0; fstreamfs; fs.open("users.txt"); if(!fs) { cout<<"读取用户文件失败,系统将自动退出。"; Sleep(3000); //延时3秒钟,给用户展示的时间 returnfalse; } //cout<<"成功。"; while(!fs.eof())//将系统用户载入 { pUserp=(pUser)malloc(sizeof(structUser)); p->UserName=(char*)calloc(USER_NAME_SIZE,sizeof(char)); fs>>p->UserName; p->password=(char*)calloc(USER_PASSWORD_SIZE,sizeof(char)); fs>>p->password; fs>>p->isAdmin; p->NextUser=NULL; p->NextUser=LoginS.pUserList; LoginS.pUserList=p; LoginS.UserNum++; }returntrue; } returnfalse;}//===============================================================================================//展示帮助菜单//showhelp()voidshowhelp(void){cout<<"有关某个命令的详细信息,请键入HELP命令名\n"; cout<<"FORMAT\t格式化文件系统\n"; cout<<"HELP\t提供文件系统命令的帮助信息\n";cout<<"LOGOUT\t退出登录文件系统\n";cout<<"CREAT\t创建文件\n";cout<<"CDIR\t创建文件夹\n";cout<<"DEL\t删除文件或文件夹\n";cout<<"CD\t显示当前目录的名称或将其更改\n";cout<<"DIR\t显示一个目录中的文件和子目录\n";cout<<"EXIT\t退出系统\n"; return;}//========================================================================================//函数介绍:系统登录模块//返回值:true登录成功,false登录失败boolLogin(void){charusername[USER_NAME_SIZE]="";intc;for(c=0;c<LOGIN_COUNT;c++) {inti=0;if(strcmp(username,"")==0)//一个管理员 { }else { }CS.FileLevel++;CS.CurrParent=base;strcpy(CS.CurrentPath,"/");//showhelp();//printf("\n%s/root%s>",username,CS.CurrentPath);break; }if(c>=LOGIN_COUNT)//非法用户 {printf("\n对不起,您不是该系统用户,按任意键退出系统。\n");returnfalse; }else {returntrue; }}//==================================================================================================//函数介绍:创建一个文件//只需修改全局变量,返回值为空。voidCreateFile(char*filename){ //cout<<filename;if(strcmp(filename,"")==0) {printf("对不起,文件名不能为空。\n"); }else {char*buf;buf=(char*)malloc(sizeof(char)*MAX_FILE_SIZE);memset(buf,'\0',MAX_FILE_SIZE);//将索引块的信息置为空printf("输入文件内容,以\"###\"结束:\n");intk=0;//记录#的个数inti=0;//记录字符串中字符的个数while(k!=3) { buf[i]=getchar(); if(buf[i]=='#') { k++; if(k==3)break; } else k=0; i++; if(i>=MAX_FILE_SIZE-3) { cout<<"超过限定文本文件大小!"; return; } }//cout<<buf<<'\t';//测试CreateFileElement(protect,filename,file,buf,CS.CurrParent); }}//=====================================================================================================//函数介绍:列出当前目录的所有文件和文件夹//输入参数:path路径voidDir(char*path){//chardisplay[COMMAND_LEN];//memset(display,'\0',COMMAND_LEN); cout<<"创建时间\t\t文件名/目录名\t文件类型\t所有者\t文件大小\n"; chartime[18];//获取现在的时间 GetCurrent_Time(time); cout<<time<<'\t'<<"."<<"\t\t<DIR>"<<endl;cout<<time<<'\t'<<".."<<"\t\t<DIR>"<<endl;//查找显示内容 { //寻找当前文件夹下的所有文件,索引文件的父节点为当前节点,文件有效,层数相等。 { {//strcat(display,"+"); } else { } } }}//======================================================================================//函数介绍:创建一个文件夹//输入参数:文件夹名voidMkdir(char*filename){if(strcmp(filename,"")==0) {printf("对不起,文件夹名不能为空。\n"); }else { //文件夹是没有文本内容的,参数分别表示为(权限、文件名称、文件类型、文件内容、文件的父亲指针)CreateFileElement(protect,filename,dir,NULL,CS.CurrParent); }}//=========================================================================================//函数介绍:从当前文件夹进入另外一个文件夹,可以是自己父亲的文件夹,也可以是自己儿子的文件夹//输入参数:文件名称voidCd(char*path){intflag=0;inti;//进行对索引文件搜索 { //如果是其父节点的话,需要匹配的条件是:(有与所在目录相同的父节点、两者在同一个层次、文件有效、两者的名字相同、其父节点必须是文件夹)flag=1;//标志位 }if(flag||strcmp(path,"..")==0)//cd..也可以返回到父节点 {intsplitDisplayCou=0;//分割符出现的次数if(strcmp(path,"..")==0)//返回上一级目录,即父目录 { //如果层数够的话if(CS.FileLevel>0) {CS.FileLevel--;CS.CurrParent=CS.CurrParent->parent; //将当前状态的文件夹父亲节点赋值给马上进入的节点for(unsignedi=strlen(CS.CurrentPath)-1;i>0;i--) {if(CS.CurrentPath[i]=='/') {splitDisplayCou++;if(splitDisplayCou==2)//已过滤掉最后一个目录名 {break; } } }chartemppath[COMMAND_LEN];strcpy(temppath,CS.CurrentPath);memset(CS.CurrentPath,'\0',COMMAND_LEN);strncpy(CS.CurrentPath,temppath,i+1); } }else { //如果是儿子节点的话,会进入下一层。chardisplay[100]=""; { {strcpy(display,"文件存在。\n");CS.FileLevel++;strcat(CS.CurrentPath,path);strcat(CS.CurrentPath,"/");break; } }if(strcmp(display,"")==0)//文件夹不存在,什么都不做 {printf("当前目录下没有您要进入的文件夹。\n"); } } }else {printf("输入的目录有错!\n"); }}//=========================================================================================================//函数介绍:删除当前目录的文件//输入参数:path路径,文件名称voidDelete(char*path){chardisplay[100]="";//记录是否有要删除的文件//在目录索引中一个一个寻找,同名,同层文件 { //查找父亲节点名字与当前坐在文件夹名相同、和自己节点曾数相同、文件有效、和自己的名字相同完全匹配的文件 {strcpy(display,"文件已删除。\n");break; } }//如果没有要删除的文件if(strcmp(display,"")==0) {strcpy(display,"当前目录下没有您要删除的文件。\n"); }printf("%s\n",display);}//===========================================================================================//函数介绍:命令分解(将输入的命令分解)//输入参数:command用户输入命令字,key关键字,path路径voidFindCommKey(char*command,char*key,char*path){for(unsignedi=0;i<strlen(command);i++) {if(command[i]=='') {i++;if(i<strlen(command)) {strcpy(path,command+i); }break; }if(i<=9) {key[i]=command[i]; }else {for(unsignedj=i;j<strlen(command);j++) {if(command[j]!='') {strcpy(path,command+j);break; } }break; } } //将字符串都转化为小写的形式strlwr(key);strlwr(path);}//======================================================================================//函数介绍:退出时清理分配的内存空间//函数:ClearFileSys()返回空(还存在问题,内存没有完全释放掉)voidClearFileSys(){free(CS.CurrentPath);free(FS.FSStart);}//===================================================================================//函数说明:登录模块//我们的用户登录模块,当登录成功返回1,不成功返回0BOOLUserLogin(void){for(;LoginS.User_Login_tims<LOGIN_COUNT;LoginS.User_Login_tims++) { cout<<"\t\t>>>>>>>>>>>>>>>>>>>用户登录<<<<<<<<<<<<<<<<<<<

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论