操作系统原理课程设计-UNIXLinux文件管理系统的仿真实验_第1页
操作系统原理课程设计-UNIXLinux文件管理系统的仿真实验_第2页
操作系统原理课程设计-UNIXLinux文件管理系统的仿真实验_第3页
操作系统原理课程设计-UNIXLinux文件管理系统的仿真实验_第4页
操作系统原理课程设计-UNIXLinux文件管理系统的仿真实验_第5页
已阅读5页,还剩40页未读 继续免费阅读

下载本文档

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

文档简介

1、 操作系统原理课程设计实践报告全套设计加扣 3012250582题 目:UNIX/Linux文件管理系统的仿真实验姓 名: 学 院: 信息科技学院 专 业: 计算机科学技术系 班 级: 计科121 学 号: 指导教师: 职称: 教授 2015年3月 18日摘要:unix/linux系统是当前十分流行的一类操作系统,而文件管理系统则是linux系统的重要组成部分。本文是在windows平台上,依据linux文件管理系统的设计原理,参照模拟linux文件系统的结构,来实现linux文件管理系统的仿真。关键字:linux 仿真 文件管理系统 理论基础:Linux虚拟文件系统采用面向对象的设计思想,V

2、FS相当于面向对象系统中的抽象类,它可派生不同子类以支持多种具体文件系统。但从效率考虑,内核纯粹的使用C语言编程,并未直接利用面向对象语义。这里使用的术语“对象”,实际上是一个结构体(struct),但它代表的的确是一个对象(object),每个对象都包含一个对象操作,描述内核针对主要对象的可用方法。Linux下文件系统将文件权限与文件属性这两部分的数据放在不同的块中,权限与属性放在INODE中,他的实际数据房子data block 中,还有一个超级块,叫做superblock会记录整个文件系统的整体星系,包括inode与block的总量,使用量,剩余量根据INODE将block中的内容读出来

3、的数据访问方式叫做索引式文件系统,我们常用的U盘是fat格式的,这种文件系统没有inode,无法将所有的block一口气的读出来,每个block号码都是记录在前一个block号码当中的,如果一个文件数据写入的分散的太厉害,磁盘磁头在磁盘转一圈无法读取到所有的数据,因此fat的文件系统常常需要碎片整理。 1.目的及意义:1.1通过在windows系统上模拟linux的文件管理系统,来熟悉书本上的linux的文件管理系统的原理,加深对于FVB和VFS的理解 1.2强化算法结构和数据结构,1.3熟悉编程语言的使用2.设计思想及设计功能说明:2.1设计思想:先建立512个块,每个块对应512个字节,在

4、建立一个有512个元素的字符数组,每个元素对应相应的块号,不管是文件或是目录都有I节点,建立自己设定数目元素的I节点表,并依次把位图区,I节点表,数据块区每个元素映射到一个二进制文件上。在每一次的操作中如果相应元素有变动,则对应在文件中更新输出相应数据,以便下一次启动程序的时候可以快速导入上一次的数据。2.2功能说明:(1)多用户 :usr1,usr2,usr3,usr8 (1-8个用户) (2)多级目录:可有多级子目录; (3)具有login (用户登录) (4)系统初始化(建文件卷、提供登录模块) (5)文件的创建:create (6)文件的打开:open (7)文件的读:read (8)

5、文件的写:write (9)文件关闭:close (10)文件重命名:rename (11)创建目录(建立子目录):mkdir (12)改变当前目录:cd (13)列出文件目录:dir (14)删除文件或目录:delet(15)文件的硬链接:in (16)文件系统的格式化:format (17)退出:logout 2.3功能详细说明:1.format模块:格式化文件系统,即初始化文件系统,相当于硬盘的格式化。将其中原有的用户及用户下的文件系统全部还原初始状态,即没有任何用户和目录、文件,也就是按设计的文件系统格式重建新的文件系统。2. get_blknum和release_blk模块:get_

6、blknum找到一个空闲数据块,并修改对应位图号元素为1。release_blk修改对应的位图元素,并把文件系统中对应的数据块清零。3. init()模块读入文件系统 4.quit()模块退出系统5 .creat()模块 创建文件,分配一空目录项,分配磁盘块。可用位示图。填写该空目录 项。如文件长度(0),文件名,类型等。6. open()模块打开文件,并判断文件类型和打开方式。 如果文件没有在文件打开表中就在文件打开表中建立该文件项。7. close()模块关闭文件,删除该文件的用户打开文件表目。8. write()模块写文件,需要先打开文件。并判断文件权限。写完后修改文件系统中的对应数据区

7、。9. read()模块读文件。需先打开文件。读入相应数据块的内容到缓冲区,然后输出。10.delet()模块 如果参数是文件则删除文件,如果是目录则删除该目录下的所有文件和目录。 11.mkdir()建立新的目录,先在I节点表中找到一个未使用的,并初始化该I节点,并在文件系统中对应更新输出。 12.cd()将当前目录切换到当前目录的一个子目录下或当前目录的父目录。13.in()创建硬链接,将几个文件链接到用一个inode节点上。14.rename()将一个文件的名字重新命名3.核心数据结构说明:3.1用户结构体 :模拟各个用户,有用户名和和登录密码两个成员。typedef struct ch

8、ar user_name10; / 用户名 char password10; / 密码 User; 3.2inode 文件节点typedef struct short inum; / 文件i节点号 char file_name10; / 文件名 char type; / 文件类型(目录、块设备、字符设备、普通文件、权限等) char user_name10; / 文件所有者 short length; / 文件长度 short parent; / int likk; /硬链接的指针 int count; /文件链接的个数,初始为0 char createtime64; /创建时间 short

9、address2; / 存放文件的地址,2*16=32位Inode;说明:索引节点是用来保存文件的各种属性。文件名是文件的外部标识,并不唯一(可以有同名文件,只要路径不同),i节点号是文件的内部标识,是唯一的。Type指示文件的类型(f表示是普通文件,d表示是目录文件)。user_name存储了该文件的所有者(即用户)的名字,parent存储了该文件的父节点的i节点号。3.3打开文件表 typedef struct short inum; / i节点号 char file_name10; / 文件名 short parent; /父节点号 short mode; / 读写模式(1:只读 2:只

10、写 3:读写) File_table;说明:inum指的是打开文件的i节点号(用户不可见);file_name指的是打开文件的文件名(用户可见);parent指的是打开的文件的父节点的i节点号;mode指的是打开文件的权限(对文件的操作权限)。4.核心算法流程: 4.1用户登录:因为是模拟的linux文件管理系统,所以无法模拟进程来调用文件,我们模拟用户来代替进程调用文件,不同的用户相当于不同的进程。 是否否是提示输入用户名和密码用户名是否存在创建新用户读入用户信息到内存开始密码是否正确结束用户登陆login()4.2初始化(init):用户登录后,需要读取二进制文件(模拟的磁盘)中存储的相关

11、数据,来恢复以前所创建保存的文件及文件目录树。 读入位示图信息到内存读入i节点信息到内存当前目录为根目录初始化打开文件表结束开始初始化函数init() 4.3创建目录(mkdir):linux文件系统中的文件分普通文件和目录文件,目录文件无法创建硬链接。 是是否否遍历i节点区要创建的目录是否存在是否有空的i节点遍历i节点区分配一个目录i节点开始结束创建目录mkdir() 4.4:显示目录: 是是否否遍历i节点区i节点的父节点是否为当前目录i节点区是否遍历完输出文件名或目录名开始结束显示目录dir() 4.5改变当前目录:输入cd xx命令来改变当前目录,实现目录的变更。 是是否否遍历i节点区a

12、rgv1=”.”目录是否存在找到的目录i节点号送当前目录inum_cur当前目录的父i节点号送当前目录inum_cur开始结束改变当前目录cd() 4.6创建文件:首先判断所要创建的文件的文件名是否在该目录下已存在,若已存在,则提示已有同名文件存在;若不存在,则创建该普通文件。 开始遍历i节点区判断该目录下是否有同名文件存在遍历i节点区是否有空I节点分配一个空I节点结束否提示已有同名文件存在是是否4.7打开文件: 开始遍历I节点区要打开的文件是否存在提示输入打开模式将打开文件信息写入打开文件信息表结束否是 4.8关闭文件: 开始遍历打开文件表文件是否已打开是将打开文件表项标志置为-1结束否5.

13、开发调试及运行环境: 我们组实在vs2010这个开发平台上,用c+语言来编写程序,仿真实现linux文件管理系统的。调试需要安装.net3.0以上版本。 6.功能说明及测试数据分析6.1用户登录打开运行程序,首先会提示输入用户名和登录密码。第一次登陆,会提示创建文件user.txt来保存用户名和密码。Admin是用户名,输入密码会以*的形式显示,来保护用户的安全。 6.2创建目录,并显示使用mkdir命令来创建一个目录,使用dir命令来显示当前目录下存在的所有的文件(包括普通文件和目录文件)。图中创建了一个名为a的目录文件,当前目录下没有普通文件,只有一个a目录文件。6.3改变目录输入cd x

14、x来改变路径,cd a是进入a目录文件。6.4创建普通文件Create命令是用来创建一个普通的文件。如果已经存在同名的文件,则会提示该文件已存在。6.5打开文件Open命令是用来打开一个普通文件,打开时会提示选择对该文件的操作权限,1.是只能读取该文件,2.是只能写该文件,3.是可读可写该文件。6.6写文件Write命令式对文件进行写操作,输入一串数据后,按住ctrl+z来结束写操作。 6.7读文件Read命令式对文件进行读操作,首先会显示该文件的长度,zp.txt文件的长度是22个字节,接着显示该文件的内容。 6.8删除文件Delet命令是对文件执行删除操作,删除普通文件时,直接删除;若删除

15、一个目录文件,则会把目录里面的文件及子目录一起删除。6.9重命名Rename命令是对文件执行重命名操作,如果文件的新名字重复,则会提示该文件名已存在。 6.10创建硬链接In命令是创建硬链接。目录文件是无法创建硬链接的。 6.11获得文件的相关属性Get命令是获得文件的相关属性,包括文件名,文件的类型,文件的所有者的名字,文件的创建时间。 6.12关闭文件6.13格式化文件管理系统Format命令是执行的格式化文件管理系统的功能,将所有的数据全部清除,然后需重新添加用户。 7.存在问题及改进 (1)由于我们使用的是固定的磁盘分块方法,每个数据块的大小为512B,如果没有写满整个数据块,剩余的空

16、间无法重新利用,所以存在着一定的空间资源浪费的问题。 (2)我们使用的是位示图的方式实现文件的空间管理,使用这种方法占用的开销比较小,但这种方法在寻找空闲数据块时比较的慢,需要从头开始寻找,每次都这样会浪费不会少的时间。 改进的方法:可以使用成组链接法。将空闲块分成若干组,每100个空闲块为一组,每组的第一空闲块登记了下一组空闲块的物理盘块号和空闲块总数。如果一个组的第二个空闲块号等于0,则有特殊的含义,意味着该组是最后一组,即无下一个空闲块。分配空闲块的时候,从前往后分配,先从第一组开始分配,第一组空闲的100块分完了,才进入第二组。释放空闲块的时候正好相反,从后往前分配,先将释放的空闲块放

17、到第一组,第一组满了,在第一组前再开辟一组,之前的第一组变成第二组。 这样可以很方便快捷的寻找空闲的数据块来存储数据。(3)由于树平和实力的局限性,我们没有实现文件系统的软链接,在文件的共享方面还模拟的不是很到位。 8.实践体会及心得顾建东:开始时,由于课堂上对于文件系统的讲解不是很多,所以我们看书有点吃力,买的参考书上对于linux的讲解也有点难以理解,所以进度不是十分的顺利,也参考了一些网上的代码。但是通过我们的努力以及老师的知道,我们逐渐的理解书本上的原理,开始融会贯通教材内容,掌握程序各功能模块的工作原理,相互联系和来龙去脉,完整地建立系统的概念。操作系统是计算机科学与技术专业中的一门

18、重要基础课,目的是让我们了解操作系统的基本概念,理解计算机系统的资源如何组织,操作系统如何有效地管理这些系统资源,用户如何通过操作系统与计算机系统打交道。通过课程设计,可以进一步理解在计算机系统上运行的其它各类操作系统,并懂得在操作系统的支持下建立自己的应用系统。操作系统课程设计,对于训练我们掌握程序设计、熟悉上机操作和程序调试技术都有重要作用。重点培养我们的思维能力、创新能力和排错能力。这次的实践活动,也激发了我的学习热情和主动性,培养我的独立工作能力,在实践活动中,将所学知识综合运用,增长才干,并积累经验。对编程语言又有了更深一层次的认识,并对编程能力有所加强,但还是很多的不足有待改进,对

19、于编程来说还需要大量的实践,才能在发现问题和解决问题中前进与提高。陈晨:开始时对课本上的理论缺乏理解在添加活动inode时花费了10多个小时在添加相关功能与调试错误上,但在答辩的时候得知对活动inode理解有误。课本上有关活动inode的部分:为此,Linux在系统所占用的内存区内开辟一张内存索引节点表,又称活动inode表,含有100个表项,每个表项成为一个活动inode。磁盘inode反映文件静态特性,活动inode反映文件动态特性。当访问某文件时。就申请一个空闲活动inode,把磁盘inode内容复制给它,随之就可用来控制文件读写。当用户关闭文件后,活动inode的内容会写到对应磁盘in

20、ode中,再释放活动inode以供它用。把FCB的主要内容与索引节点号分开,不仅能够加快目录检索速度,而且便于实现文件共享。对此我的理解是活动inode可能类似于一个快表,开始是空的,当打开文件的时候,将文件内容读入内存中,因为内存读取速度比硬盘读取速度快,从而达到加快文件读写速度的目的。这个想法的错误之处在于,如果一个文件的大小过大,压根无法读取到内存中,即使可以读取到内存中,每打开一个文件就送到内存中运行是完全没有效率的,也是不现实的。但我对老师讲解的活动inode还有些疑问:老师说活动inode在初始化系统时就已经读入了信息,而课本上的相关内容是“当访问某文件时,就申请一个空闲活动ino

21、de,把磁盘inode内容复制给它,随之就可用来控制文件读写”。如果活动inode在一开始时就已经读入了信息,那么访问文件时还会有空闲吗?单旭: 在本次课设中,我主要负责的是文件系统内的的登陆,文件的关闭,文件的删除及文件的删除后的空间的释放,以及对文件 文件系统在登录时需要将登录时的权限赋给登陆的文件系统,只有在该文件系统下,该用户才可以进行对文件系统的各种操作,而之前参考的是只要输入对了账号密码就可以进行对文件系统的操作。修改之后实现了书上文件系统的文件保护属性,规定了该文件谁可以访问,可以进行何种操作。 在文件的关闭中,模拟了文件系统打开文件表file_array,将对应节点打开文件表项

22、的值改为-1,从而实现关闭文件,而不是直接调用fclose直接关闭文件,实现了书中的利用系统打开文件表项来实现文件的关闭。 对文件的删除中,并不是直接用remove函数,而是在位图bitmap中将该文件的位图信息改为0,从而实现将文件所在的空间的标识为空,下次可以继续用,不仅删除了文件,而且达到了释放空间的目的。 增加了显示当前目录下的子目录和文件名的功能,通过遍历i节点数组,从而统计出当前目录下的目录文件和普通文件的数目。9.参考文献 1.汤子瀛编.计算机操作系统.西安电子科技大出版社。2.郑扣根译操作系统概念. 高等教育出版社。3.郑阿奇 Linux内核精析.电子工业出版社10.带注释的核

23、心部分源码/定义常量#define BLKSIZE 512/ 数据块的大小 #define BLKNUM 512/ 数据块的块数#define INODESIZE 32/ i节点的大小#define INODENUM 32/ i节点的数目#define FILENUM 8/ 打开文件表的数目/函数申明void login();/登陆void init();/inode读入内存int analyse(char *);/分析用户命令void save_inode(int);/保存节点到文件系统int get_blknum();/获取块号void read_blk(int);/读块void writ

24、e_blk(int);/写块void release_blk(int);/释放块void pathset();/设置文件目录void del(int);void help();/用户帮助void cd();/改变当前目录void dir();/列出文件目录void mkdir();/创建目录void creat();/创建文件void open();/打开文件void read();/读文件void write();/写文件void close();/关闭文件void delet();/删除文件void logout();/注销void command();/void quit();/退出系统

25、#includevariable.h/*每个目录项包含16B,在目录项中,第1、2字节为相应文件的外存i节点号,是该文件的内部标识;后14B为文件名,是该文件的外部标识。*/定义全局变量 charchoice;/ Y/N y/nintargc;/ 用户命令的参数个数char*argv5;/ 用户命令的参数 argv0为命令名,其他为参数。如create user,create为argv0intinum_cur;/ 当前目录chartemp2*BLKSIZE;/ 缓冲区Useruser;/ 当前的用户charbitmapBLKNUM;/ 位图数组Inodeinode_arrayINODENUM;

26、/ i节点数组File_table file_arrayFILENUM;/ 打开文件表数组charimage_name10 = data.dat;/ 文件系统名称FILE*fp;/ 打开文件指针void format()/格式化文件系统int i;Inode inode;printf(格式化文件系统: Y/N?n);scanf(%c, &choice); getchar(); if(choice = y) | (choice = Y) if(fp=fopen(image_name, w+t) = NULL) /读写打开一个二进制文件,若读取失败 /在磁盘中申请一个二进制文件模拟UNIX内存 p

27、rintf(无法创建文件%sn, image_name); exit(-1); /结束程序,在操作系统中一般0为正常退出,其他数字为不正常 for(i = 0; i BLKSIZE; i+)/如果读取成功 fputc(0, fp);/将0写到fp指向的位置,成功写入会使fp后移1个字节 inode.inum = 0; strcpy(inode.file_name, /); /将 /复制到inode.file_name开始的地址空间 inode.type = d; /文件类型为directory,目录文件 strcpy(inode.user_name, /); /以下为初始化节点信息 inode

28、.parent = 0; inode.length = 0; inode.address0 = -1; inode.address1 = -1; fwrite(&inode, sizeof(Inode), 1, fp); /fwrite(指针,单字节数,数据项个数,指针) inode.inum = -1; /inode节点区 for(i = 0; i 31; i+) fwrite(&inode, sizeof(Inode), 1, fp); for(i = 0; i BLKNUM*BLKSIZE; i+) fputc(0, fp);/清空数据块 fclose(fp); if(fp=fopen(

29、user.txt, w+) = NULL) /读写打开user.txt,若打开成功,则删除文件信息,失败则新建 /FILE * fopen(const char * path,const char * mode); printf(无法创建文件user.txtn); exit(-1); fclose(fp); printf(文件系统初始化完毕,请登录:n);return;void login()/用户登陆与注册char *p;int flag;char user_name10;char password10;char file_name10 = user.txt;/创建一个文本文档保存用户信息d

30、o printf(请输入用户名:); gets(user_name); /读取字符串,以回车作为结束 printf(请输入密码:); p=password; while(*p=getch() if(*p = 0x0d) /回车 *p=0; /将输入的回车键转换成空格 break; printf(*); /将输入的密码以*号显示 p+; flag = 0; /设计标志位,循环登录界面(应对用户输错密码的情况) if(fp = fopen(file_name, r+) = NULL)/打开可读写文件user.txt printf(n无法打开 %s.n, file_name); printf(文件不

31、存在,将创建n); format();/初始化 login();/重新登陆 while(!feof(fp)/遍历文件流,查找所有用户,寻找匹配的用户 fread(&user, sizeof(User), 1, fp);/读取输入流到user / 已经存在的用户, 且密码正确 if(!strcmp(user.user_name, user_name) & !strcmp(user.password, password)/若用户名与密码匹配,strcmp函数返回0 fclose(fp); printf(n); return; / 已经存在的用户, 但密码错误 else if(!strcmp(use

32、r.user_name, user_name) printf(n密码不正确,请重新输入:n); flag = 1; /如果用户已存在但密码错误,则一直循环 fclose(fp); break; if(flag = 0) break;while(flag);/如果用户已存在但密码错误,则一直循环/ 用户不存在,创建新用户if(flag = 0) printf(n是否创建新用户,Y/N?); scanf(%c, &choice); gets(temp); if(choice = y) | (choice = Y)/添加新用户的信息到user.txt strcpy(user.user_name, u

33、ser_name); strcpy(user.password, password); fwrite(&user, sizeof(User), 1, fp); /将用户名和密码写到user文本,确保下次登录时,该用户存在 fclose(fp); return; if(choice = n) | (choice = N) login();void init()/将所有i节点读入内存int i;if(fp = fopen(image_name, r+b) = NULL)/读写打开,允许在结尾附加 printf(文件%s无法打开.n, image_name); exit(-1);for(i = 0;

34、 i BLKNUM; i+)/ 读入位图bitmapi = fgetc(fp);for(i = 0; i INODENUM; i+) /读入i节点信息 fread(&inode_arrayi, sizeof(Inode), 1, fp);inum_cur = 0;/ 当前目录为根目录for(i = 0; i FILENUM; i+)/ 初始化打开文件表 file_arrayi.inum = -1;/初始化时,打开表中没有表int get_blknum()/申请一个数据块int i;for(i = 0; i 1fclose(fp);return i;void read_blk(int num)/

35、将i节点号为num的文件读入temp int i, len;char ch;int add0, add1;len = inode_arraynum.length;/得到该inode节点的长度,即文件长度add0 = inode_arraynum.address0;/得到文件的地址/若文件的大小大于一个块if(len 512) add1 = inode_arraynum.address1;if(fp = fopen(image_name, r+b) = NULL) printf(无法打开文件%s.n, image_name); exit(-1);fseek(fp, BLKSIZE+INODESI

36、ZE*INODENUM +add0*BLKSIZE, SEEK_SET);ch = fgetc(fp);for(i=0; (i len) & (ch != 0) & (i = 512) fseek(fp,BLKSIZE+INODESIZE*INODENUM+add1*BLKSIZE, SEEK_SET); ch = fgetc(fp); for(; (i len) & (ch != 0); i+) tempi = ch; ch = fgetc(fp); tempi = 0;fclose(fp);void write_blk(int num)/将temp的内容输入数据区int i, len;in

37、t add0, add1;add0 = inode_arraynum.address0;len = inode_arraynum.length;if(fp = fopen(image_name, r+b) = NULL) printf(无法打开文件%s.n, image_name); exit(-1);fseek(fp, BLKSIZE+INODESIZE*INODENUM+add0*BLKSIZE, SEEK_SET);for(i=0; (ilen)&(tempi!=0)&(i 512); i+) fputc(tempi, fp);if(i = 512) add1 = inode_array

38、num.address1; fseek(fp, BLKSIZE+INODESIZE*INODENUM+add1*BLKSIZE, SEEK_SET); for(; (i len) & (tempi != 0); i+) fputc(tempi, fp);fputc(0, fp);fclose(fp);void release_blk(int num)/释放文件块号为num的文件占用的空间FILE *fp;if(fp=fopen(image_name, r+b) = NULL) printf(无法打开文件%sn, image_name); exit(-1);bitmapnum = 0; /改变位

39、图信息fseek(fp, num, SEEK_SET);fputc(0, fp);fclose(fp);void pathset()/设置文件路径并显示char path50;int m,n;if(inode_arrayinum_cur.inum = 0)/ strcpy(path,user.user_name);else/如果不是 strcpy(path,user.user_name); m=0; n=inum_cur; while(m != inum_cur) while(inode_arrayn.parent != m) n = inode_arrayn.parent;/ strcat(

40、path,/); strcat(path,inode_arrayn.file_name); m = n; n = inum_cur; printf(%s$,path);void getnowpath(char path150)/得到当前文件路径/char path50;int m,n;if(inode_arrayinum_cur.inum = 0)/ strcpy(path1,user.user_name);else/如果不是 strcpy(path1,user.user_name); m=0; n=inum_cur; while(m != inum_cur) while(inode_arra

41、yn.parent != m) n = inode_arrayn.parent;/ strcat(path1,/); strcat(path1,inode_arrayn.file_name); m = n; n = inum_cur; void getappointpath(Inode inodes,char path150)/得到指定的文件的路径/char path50;int m,n;int inum_curs=inodes.parent;if(inode_arrayinum_curs.inum = 0) strcpy(path1,user.user_name);else/如果不是 str

42、cpy(path1,user.user_name); m=0; n=inum_cur; while(m != inum_curs) while(inode_arrayn.parent != m) n = inode_arrayn.parent;/ strcat(path1,/); strcat(path1,inode_arrayn.file_name); m = n; n = inum_curs; void getappointpath(File_table inodes,char path150)/得到指定的文件的路径/char path50;int m,n;int inum_curs=inodes.parent;if(inode_arrayinum_curs.inum = 0) strcpy(path1,user.user_name);else/如果不是 strcpy(p

温馨提示

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

评论

0/150

提交评论